我对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.
我需要模型的行的错误点。
我搜索了类似的问题但没有找到任何有用的解释我的问题。 另一个模型出现了同样的问题,但拼写方向不同。 我很迷茫。也许有人有同样的问题,或者能够解释发生/发生的事情以及导致问题的原因。
提前谢谢你。
每个人都有一个成功的一周。
答案 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)
你在定义用户模型的文件名是什么?在我看来,它可能只是你要求错误的文件名