Как избавиться от ошибки: "OverwriteModelError: невозможно перезаписать` undefined `модель после компиляции."?
У меня есть общий метод обновления документа любой коллекции в MongoDB?
Следующий код находится в имени файла Deleter.js
module.exports.MongooseDelete = function (schemaObj, ModelObject);
{
var ModelObj = new mongoose.Model("collectionName",schemaObj);
ModelObj.remove(ModelObject);
}
И вызывая в моем основном файле app.js следующее:
var ModObj = mongoose.model("schemaName", schemasObj);
var Model_instance = new ModObj();
var deleter = require('Deleter.js');
deleter.MongooseDelete(schemasObj,Model_instance);
Я получаю следующую ошибку:
OverwriteModelError: Cannot overwrite `undefined` model once compiled.
at Mongoose.model (D:\Projects\MyPrjct\node_modules\mongoose\lib\index.js:4:13)
Я получаю только вызов 2-го метода.
Пожалуйста, дайте мне знать, если у кого-то есть какое-то решение.
Ответы
Ответ 1
Я думаю, что вы дважды создали экземпляр mongoose.Model()
на той же схеме. Вы должны были создать каждую модель только один раз и иметь глобальный объект, чтобы удержать их при необходимости
Я предполагаю, что вы объявляете разные модели в разных файлах в каталоге $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);
в вашем приложении app.js
APP.models = require('./models'); // a global object
И когда вам это нужно
// Use A
var A = APP.models('A');
// A.find(.....
// Use B
var B = APP.models('B');
// B.find(.....
Ответ 2
Мне удалось решить проблему следующим образом:
var Admin;
if (mongoose.models.Admin) {
Admin = mongoose.model('Admin');
} else {
Admin = mongoose.model('Admin', adminSchema);
}
module.exports = Admin;
Ответ 3
Я стараюсь избегать глобалов как можно больше, поскольку все по ссылке, и все может стать беспорядочным. Мое решение
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);
}
}
Ответ 4
Мне было лучше избегать глобальных и исключений -
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;
Ответ 5
На самом деле проблема заключается не в том, что mongoose.model()
создается дважды.
Проблема в том, что Schema
создается более одного раза.
Например, если вы выполняете mongoose.model("Model", modelSchema)
n раз, и вы используете ту же ссылку на схему, это не будет проблемой для мангуста.
Проблема возникает, когда вы используете другую ссылку схемы на той же модели i.e
var schema1 = new mongoose.Schema(...);
mongoose.model("Model", schema1);
mongoose.model("Model", schema2);
Это та ситуация, когда эта ошибка возникает.
Если вы посмотрите на источник (mongoose/lib/index.js:360)
, это проверка
if (schema && schema.instanceOfSchema && schema !== this.models[name].schema){
throw new mongoose.Error.OverwriteModelError(name);
}