无法修复猫鼬覆盖模型错误

Posted

技术标签:

【中文标题】无法修复猫鼬覆盖模型错误【英文标题】:Can't fix mongoose overwrite model error 【发布时间】:2015-02-12 09:40:26 【问题描述】:

我正在使用 angular-fullstack 生成器,并且我添加了一个模型人员。当我尝试在 seed.js 文件中要求 person 模型时,出现此错误。

    /Users/dev/wishlist/node_modules/mongoose/lib/index.js:334
      throw new mongoose.Error.OverwriteModelError(name);
            ^
OverwriteModelError: Cannot overwrite `Person` model once compiled.
    at Mongoose.model (/Users/dev/wishlist/node_modules/mongoose/lib/index.js:334:13)
    at Object.<anonymous> (/Users/dev/wishlist/server/api/wishList/person.model.js:11:27)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/Users/dev/wishlist/server/api/wishList/wishList.controller.js:4:14)
    at Module._compile (module.js:456:26)

我采用了与生成器附带的“事物”模型相同的结构。还进行了搜索以及 Person 在代码库中的位置,并且仅在 person.model.js 和控制器中。

person.model.js:

'use strict';

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

var PersonSchema = new Schema(
  name: String,
  quote: String
);

module.exports = mongoose.model('Person', PersonSchema);

wishlist.controller.js:

'use strict';

var _ = require('lodash');
var Person = require('./person.model');

// Get all the People that have wish lists
exports.getPeople = function(req, res) 
  Person.find(function (err, people) 
    if(err)  return handleError(res, err); 
    return res.json(200, people);
  );
;

function handleError(res, err) 
  return res.send(500, err);

我错过了什么?

【问题讨论】:

我遇到了同样的问题,虽然下面的建议似乎“解决”了我的问题,但很难相信这是解决问题的正确方法。 【参考方案1】:

根据您发布的信息,据我了解,问题似乎是由以下几行引起的:

在对象。 (/Users/dev/wishlist/server/api/wishList/person.model.js:11:27)

module.exports = mongoose.model('Person', PersonSchema);

在对象。 (/Users/dev/wishlist/server/api/wishList/wishList.controller.js:4:14)

var Person = require('./person.model');

此错误最常见于 Mongoose 模型之间的不匹配。

在路上的某个地方,您以不同的名称定义了此模型,但使用相同的架构。

为了查看这是否是导致您的错误的原因,请在您需要 mongoose 之后将此代码添加到 person.model.js

'use strict';

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

mongoose.models = ;
mongoose.modelSchemas = ;

这将清除您的猫鼬数据并清空所有现有模型和架构。

我在以下LINK找到了上述信息。

我还发现了一些解决此问题的其他讨论 HERE 和 HERE。

【讨论】:

感谢弗拉德修复它。我担心这个解决方案,因为这可能会清空我创建的其他模式。我阅读了您链接的文章,但没有一篇能真正解决我的问题。我明白出了什么问题,我只是不知道哪里出了问题。据我所知,我只定义了一次架构。【参考方案2】:

几周前我也遇到了同样的错误。在尝试了几件事后,我得出了一个简单的解决方法:

尝试以这种方式导出人物模型 -

module.exports.PersonModel = mongoose.model('Person', PersonSchema);

而不是-module.exports = mongoose.model('Person', PersonSchema);

希望这会有所帮助!

如果您仍然收到错误,只是您导出此模型的模块中的路径。

【讨论】:

以上是关于无法修复猫鼬覆盖模型错误的主要内容,如果未能解决你的问题,请参考以下文章

摩卡——手表和猫鼬模型

变异时如何修复“猫鼬模型的名称”不是graphql中的构造函数

测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]

如何修复“需要路径,验证错误”,猫鼬,节点

如何修复“需要路径,验证错误”,猫鼬,节点

如何修复节点 js 和猫鼬中的缓冲超时错误