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 appelant 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 comstackd. 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.

Je pense que vous avez instancié deux fois mongoose.Model() sur le même schéma. Vous devez avoir créé chaque modèle une seule fois et disposer d’un object 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(..... 

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; 

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); } } 

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: Ssortingng, subCategory: [ { categoryCode: Ssortingng, subCategoryName: Ssortingng, code: Ssortingng } ] }, { collection: 'category' }); model = mongoose.model('Category', CategorySchema); } else { model = mongoose.model('Category'); } module.exports = model; 

En réalité, le problème n’est pas que mongoose.model() soit instancié deux fois. Le problème est que le Schema est instancié plus d’une fois. Par exemple, si vous faites mongoose.model("Model", modelSchema) n fois et que vous utilisez la même référence au schéma, cela ne mongoose.model("Model", modelSchema) pas de problème pour mongoose. 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 où cette erreur se produit.

Si vous regardez le 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); } 

Cela est dû au fait qu’il faut un modèle sur deux chemins.

// Commenter le fichier modèle

 var mongoose = require('mongoose') var Schema = mongoose.Schema var CommentSchema = Schema({ text: Ssortingng, author: Ssortingng }) module.exports = mongoose.model('Comment', CommentSchema) 

// fichier de semences

 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 allez throw new mongoose.Error.OverwriteModelError(name) mongoose.Error.OverwriteModelError, car vous avez besoin du modèle Comment de deux manières différentes. Fichier source var Comment = require('./models/Comment') , Fichier d’index var Comment = require('./models/comment')