如何摆脱错误:“OverwriteModelError:编译后无法覆盖`undefined`模型。”?

时间:2013-02-01 07:48:11

标签: node.js mongodb mongoose

我有一个更新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)

我只接受第二次方法通话 如果有人有解决方案,请告诉我。

6 个答案:

答案 0 :(得分:40)

我设法解决了这个问题:

var Admin;

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

module.exports = Admin;

答案 1 :(得分:24)

我认为你已经在同一个架构上实例化了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 :(得分:8)

我尽量避免使用全局变量,因为所有内容都是通过引用来实现的,而事情可能会变得混乱。我的解决方案

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

答案 3 :(得分:3)

我发现最好避免全局和异常处理 -

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;

答案 4 :(得分:2)

实际上问题不在于mongoose.model()被实例化两次。 问题是Schema被实例化了不止一次。 例如,如果您执行mongoose.model("Model", modelSchema) n次并且使用相同的Schema引用,那么对于mongoose来说这不是问题。 当您在同一模型上使用另一个模式引用时会出现问题,即

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

答案 5 :(得分:0)

这是因为在两个路径中需要一个模型。

//评论模型文件

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

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

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

//种子文件

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

//索引文件

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

现在你将获得throw new mongoose.Error.OverwriteModelError(name),因为你需要两种不同的评论模型。种子文件var Comment = require('./models/Comment'),索引文件var Comment = require('./models/comment')