web-dev-qa-db-fra.com

Comment se débarrasser de l'erreur: "OverwriteModelError: impossible d'écraser le modèle` undefined` une fois compilé. "?

J'ai une méthode commune pour mettre à jour un document de n'importe quelle collection dans MongoDB?

Le code suivant est dans le nom de fichier Deleter.js

module.exports.MongooseDelete = function (schemaObj, ModelObject);
{
  var ModelObj = new mongoose.Model("collectionName",schemaObj);
  ModelObj.remove(ModelObject);
}

Et en invoquant comme suit dans mon fichier principal app.js :

var ModObj = mongoose.model("schemaName", schemasObj);
var Model_instance = new ModObj();
var deleter = require('Deleter.js');
deleter.MongooseDelete(schemasObj,Model_instance);

Je reçois l'erreur suivante:

OverwriteModelError: Cannot overwrite `undefined` model once compiled.
    at Mongoose.model (D:\Projects\MyPrjct\node_modules\mongoose\lib\index.js:4:13)

Je ne reçois que le deuxième appel de méthode .. Merci de me faire savoir si quelqu'un a une solution.

16
Amol M Kulkarni

Je pense que vous avez instancié mongoose.Model() sur le même schéma deux fois. Vous devez avoir créé chaque modèle une seule fois et disposer d'un objet global pour les récupérer en cas de besoin.

Je suppose que vous déclarez différents modèles dans différents fichiers sous le répertoire $YOURAPP/models/

$YOURAPPDIR/models/
 - index.js
 - A.js
 - B.js

index.js 

module.exports = function(includeFile){
    return require('./'+includeFile);
};

A.js

module.exports = mongoose.model('A', ASchema);

B.js

module.exports = mongoose.model('B', BSchema);

dans votre app.js

APP.models = require('./models');  // a global object

Et quand vous en avez besoin

// Use A
var A = APP.models('A');
// A.find(.....

// Use B
var B = APP.models('B');
// B.find(.....
22
hotienvu

J'ai réussi à résoudre le problème comme ceci:

var Admin;

if (mongoose.models.Admin) {
  Admin = mongoose.model('Admin');
} else {
  Admin = mongoose.model('Admin', adminSchema);
}

module.exports = Admin;
39
paulbjensen

J'essaie d'éviter autant que possible les globaux, car tout est par référence et les choses peuvent devenir compliquées. Ma solution 

model.js 

  try {
    if (mongoose.model('collectionName')) return mongoose.model('collectionName');
  } catch(e) {
    if (e.name === 'MissingSchemaError') {
       var schema = new mongoose.Schema({ name: 'abc });
       return mongoose.model('collectionName', schema);
    }
  }
8
user1082679

J'ai trouvé mieux d'éviter les remises globales et d'exceptions.

var mongoose = require("mongoose");
var _ = require("underscore");

var model;
if (_.indexOf(mongoose.modelNames(), "Find")) {
    var CategorySchema = new mongoose.Schema({
        name: String,
        subCategory: [
            {
                categoryCode: String,
                subCategoryName: String,
                code: String
            }
        ]
    }, {
        collection: 'category'
    });
    model = mongoose.model('Category', CategorySchema);
}
else {
    model = mongoose.model('Category');
}


module.exports = model;
3
Kavi

En réalité, le problème n’est pas que mongoose.model() soit instancié deux fois. Le problème est que la Schema est instanciée plus d'une fois. Par exemple, si vous utilisez mongoose.model("Model", modelSchema) n fois et que vous utilisez la même référence au schéma, cela ne poserait pas de problème pour mangouste. Le problème survient lorsque vous utilisez une autre référence de schéma sur le même modèle, à savoir

var schema1 = new mongoose.Schema(...);
mongoose.model("Model", schema1);
mongoose.model("Model", schema2);

C'est la situation lorsque cette erreur se produit.

Si vous regardez la source (mongoose/lib/index.js:360) c'est la vérification

if (schema && schema.instanceOfSchema && schema !== this.models[name].schema){
    throw new mongoose.Error.OverwriteModelError(name);
}
2
Nikolay Stavrev

En effet, un modèle est requis dans deux chemins.

// Commenter le fichier modèle

var mongoose = require('mongoose')
var Schema = mongoose.Schema

var CommentSchema = Schema({
  text: String,
  author: String
})

module.exports = mongoose.model('Comment', CommentSchema)

// fichier Seed

const commentData = {
  user: "David Lee",
  text: "This is one comment"
}
var Comment = require('./models/Comment')

module.exports = function seedDB () {
  Comment.create(commentData, function (err, comment) {
    console.log(err, commemt)
  })
}

// fichier d'index 

var Comment = require('./models/comment')
var seedDB = require('./seeds')
seedDB()
const comment = {
  text: 'This girl is pretty!',
  author: 'David'
}
Comment.create(, function (err, comment) {
    console.log(err, comment)
 })

Maintenant, vous obtiendrez throw new mongoose.Error.OverwriteModelError(name), Parce que vous avez besoin du modèle Comment de deux manières différentes. Seed _ file var Comment = require('./models/Comment') , Index file var Comment = require('./models/comment')

0
DavidLee