Как избавиться от ошибки: "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);
}