需要模型的猫鼬错误

时间:2017-02-22 08:15:18

标签: javascript node.js mongodb express mongoose

我对NodeJS,require和mongoose有一个相当奇怪的问题。 我为这样的用户模型创建了一个模式:

let mongoose = require('mongoose');
let Schema = mongoose.Schema;

let depositSchema = new Schema({
    customer: String,
    tyres : {
        amount: { type: Number, min: 1, required : true},
        tyreType : { type: String, required : true }
    },
    created : {
        at : { type: Date, default : Date.now },
        by : { type : Schema.ObjectId }
    },
    last_modified : {
        at : { type: Date },
        by : { type: Schema.ObjectId }
    },
    located_at : {
        column: { type: String, required : true },
        row: { type: String, required : true }
    }
});

depositSchema.pre('save', function(next) {
    let date = new Date();

    this.last_modified.at = date;

    if(!this.created.at) {
        this.created.at = date;
    }

    next();
});

module.exports = mongoose.model('Deposit', depositSchema);

所以你可以看到该文件导出了mongoose模型。 如果我需要另一个这样的文件:

let Deposit = require('../../models/deposit);

一切都很好。一切正常,我没有问题使用模型并从中创建对象以将其保存在Mongo中。

但如果我需要这样的模型:

let Deposit = require('../../models/Deposit);

我从Mongo收到此错误:

    /app/node_modules/mongoose/lib/index.js:376
      throw new mongoose.Error.OverwriteModelError(name);
      ^
MongooseError: Cannot overwrite `Deposit` model once compiled.

我需要模型的行的错误点。

我搜索了类似的问题但没有找到任何有用的解释我的问题。 另一个模型出现了同样的问题,但拼写方向不同。 我很迷茫。也许有人有同样的问题,或者能够解释发生/发生的事情以及导致问题的原因。

提前谢谢你。

每个人都有一个成功的一周。

5 个答案:

答案 0 :(得分:1)

 var  mongoose = require('mongoose');
 let Deposit = mongoose.model('Deposit');

使用上面两行代替:let Deposit = require('../../models/deposit');

答案 1 :(得分:1)

问题是Node 需要缓存并不知道../../models/deposit../../models/Deposit实际上是同一个文件。

如果它知道它们是,它将不会再次加载和执行该文件,而是从第一次加载时返回先前的导出值(存储在缓存中)。

但是,因为它看到这些文件不同,它会加载并执行两次文件,第二次它会导致错误被抛出(因为它运行"创建模型&#34 ;代码两次,Mongoose不喜欢)。

有一些解决方法,但最终,每次require()文件时,都应该使用正确的文件名(它在Finder / Explorer /中的显示方式)。

答案 2 :(得分:0)

我认为问题是你在这行代码module.exports = mongoose.model('Deposit', depositSchema);上定义了一个名为Deposit的模型,然后你尝试使用同名Deposit的变量重新定义它。

您是否尝试过像var deposit = requrire(../../models/deposit);这样的内容?

答案 3 :(得分:0)

我尝试了Israel.zinc的建议,并将存款模式重新命名为“存款1”和“存款1”。在出口线。 之后我试图像这样要求:

let Deposit = require('../../models/Deposit'); 

收到完全相同的Mongoose错误,除了它说"不能覆盖' Deposit1' ..." 如果我这样要求:

let Deposit = require('../../models/deposit');

一切正常......

答案 4 :(得分:0)

你在定义用户模型的文件名是什么?在我看来,它可能只是你要求错误的文件名