¿Cómo deshacerse del error: “OverwriteModelError: no se puede sobrescribir el modelo` undefined` una vez comstackdo ”?

Tengo un método común para actualizar el documento de cualquier colección en MongoDB?

El siguiente código está en el nombre de archivo Deleter.js

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

E invocando como sigue en mi archivo principal app.js :

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

Estoy recibiendo el siguiente error:

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

Recibo solo en el segundo método. Por favor, hágame saber si alguien tiene alguna solución.

Creo que has instanciado mongoose.Model() en el mismo esquema dos veces. Debería haber creado cada modelo solo una vez y tener un objeto global para obtenerlos cuando sea necesario.

Supongo que declara diferentes modelos en diferentes archivos en el directorio $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); 

en tu app.js

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

Y cuando lo necesites.

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

Me las arreglé para resolver el problema de esta manera:

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

Trato de evitar lo más global posible, ya que todo es por referencia, y las cosas pueden complicarse. Mi solución

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

Me pareció mejor evitar el manejo global y de excepciones.

 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; 

En realidad, el problema no es que mongoose.model() sea ​​instanciado dos veces. El problema es que el Schema se crea una instancia más de una vez. Por ejemplo, si lo hace mongoose.model("Model", modelSchema) n veces y está usando la misma referencia al esquema, esto no sería un problema para la mongoose. El problema surge cuando usa otra referencia de esquema en el mismo modelo, es decir

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

Esta es la situación cuando se produce este error.

Si nos fijamos en la fuente (mongoose/lib/index.js:360) esta es la verificación

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

Esto se debe a que requiere un modelo en dos caminos.

// Archivo de modelo de comentario

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

// archivo semilla

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

// archivo de índice

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

Ahora obtendrás el throw new mongoose.Error.OverwriteModelError(name) , Porque necesitas un modelo de comentario de dos maneras diferentes. Archivo semilla var Comment = require('./models/Comment') , Index file var Comment = require('./models/comment')