[英]Mongoose error requiring a model
我对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);
因此,您可以看到文件导出了猫鼬模型。 如果我在另一个这样的文件中需要此文件:
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.
我需要模型的线上有错误点。
我搜索了与require类似的问题,但没有找到任何有用的解释我问题的信息。 另一个模型也会出现相同的问题,但拼写方向不同。 我很困扰。 也许有人遇到了相同的问题,或者能够解释发生了什么/发生了什么以及导致问题的原因。
先感谢您。
祝大家有个成功的一周。
var mongoose = require('mongoose');
let Deposit = mongoose.model('Deposit');
改用上述两行: let Deposit = require('../../models/deposit');
问题在于节点要求缓存不知道../../models/deposit
和../../models/Deposit
实际上是同一文件。
如果知道它们是正确的,则它将不会再次加载并执行该文件,而是从第一次加载时返回先前导出的值(存储在缓存中)。
但是,由于它看到这些文件不同,因此它将加载并执行两次文件,并且第二次将引发错误(因为它两次运行“ create-a-model”代码,而Mongoose不会) t喜欢)。
有一些解决方法,但最终,每次require()
文件时,都应使用正确的文件名(在Finder / Explorer /任何文件中的显示方式)。
我相信问题是您在此代码module.exports = mongoose.model('Deposit', depositSchema);
行上定义了一个名为Deposit的模型module.exports = mongoose.model('Deposit', depositSchema);
然后您尝试使用具有相同名称Deposit
的变量再次重新定义它。
您是否尝试做类似var deposit = requrire(../../models/deposit);
?
我尝试了Israel.zinc的建议,并在出口行的“ Deposit1”中重命名了存款模型。 之后,我试图像这样要求它:
let Deposit = require('../../models/Deposit');
并收到了完全相同的猫鼬错误,但提示“无法覆盖'Deposit1'...”,如果我这样要求它:
let Deposit = require('../../models/deposit');
一切正常...
您要在其中定义用户模型的文件的名称是什么? 我认为这可能只是您要求的文件名错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.