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緩存必須認爲它們是兩個不同的文件。 –