2017-02-22 92 views
0

我对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); 

我得到这个错误从蒙戈:在该行

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

错误点,我需要的模式。

我搜索了与require相似的问题,但没有找到任何有用的东西解释了我的问题。 与另一个模型发生同样的问题,但拼写方向不同。 我很困惑。也许有人遇到同样的问题,或者能够解释发生了什么事情以及造成问题的原因。

预先感谢您。

大家都成功了一周。

回答

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

两个线路改为:let Deposit = require('../../models/deposit');

+0

谢谢你@爱情关键你的答案。它工作正常。我想知道接收模型的两种方式之间的实际区别在哪里?我使用的那个被许多在他们的博客和教程中写的人使用。 – W0RLDB47ANCE

+0

您使用mongoose.model('Deposit',depositSchema)定义模型的对象;没有必要再执行一次。每当你使用require时,通过使用require你的文件得到执行。所以得到它的方式是:让Deposit = mongoose.model('Deposit'); –

+0

好的,很高兴知道。非常感谢您的回答和解释 – W0RLDB47ANCE

0

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

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

+0

感谢您的超级快速回答。我试着用var,但得到了同样的问题。我有一个用户模型,这是设计像存款模式,我试图要求与var和不同的拼写类型(下/上),但从mongo得到相同的错误... – W0RLDB47ANCE

+0

问题是不是变种,是更低情况下的变量名称。 –

+0

要求存款模式我目前使用小写拼写,因为它只能像这样工作。 – W0RLDB47ANCE

0

我试了一下Israel.zinc建议并在出口行的'Deposit1'中重新命名了存款模式。 后来我想需要这样的:

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

并得到完全相同的猫鼬的错误,除了它说“无法覆盖‘Deposit1’......” 如果我需要这样的:

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

一切工作正常...

0

什么是您在其中定义您的usermodel文件的名称?在我看来,这可能只是一个文件名,你需要使用错误的上述

+0

这是'user.js',存款是'deposit.js',这是我没有得到的,这是显而易见的,如果我给他们命名不同,但都是小写,而且完全相同的导出为大写。 .. – W0RLDB47ANCE

1

的问题在于节点需要缓存不知道../../models/deposit../../models/Deposit实际上是相同的文件。

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

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

有几个解决方法,但最终你应该使用正确的文件名(如何在Finder/Explorer/whatever中出现),每次你使用这个文件。

+0

我认为这是正确的答案。在我的情况下,我需要以两种不同的方式使用同一个文件(一次使用相对URL,从包内部使用,一次使用包名称,从包外部使用),并且require缓存必须认为它们是两个不同的文件。 –