2014-12-04 27 views
2

我的模塊會注入貓鼬實例,但現在它們都使用在最後一隻貓鼬上設置的數據庫。在模塊中注入獨特的貓鼬實例

例如,我的主模塊創建了很多模塊,然後調用它們的init。

var mongoose = require('mongoose'); 
//... 
mongoose.connect(connString);//specific to finance 
var finance = require('finance').init({db:mongoose}); 

之前,我本身注入貓鼬實例所需貓鼬的財務模塊,並因爲它是在node_modules它得到它自己的貓鼬。現在;無論我製作多少個主要模塊,以及我打電話多少次,都會得到第一次獲得的實例。

因此,創建的所有模塊都將連接到上次連接設置的任何模塊。

它是可以使用的createConnection,但仍然不知道如何注入貓鼬,我想:

var mongoose = require('mongoose'); 
//... 
var c = mongoose.createConnection(connString);//specific to finance 
mongoose.connection=c; 
var finance = require('finance').init({db:mongoose}); 

現在,我得到一個錯誤like Cannot overwrite金融model once compiled.

不知怎的,這是很難得到的另一個實例貓鼬在同一模塊。這很有趣,因爲根據貓鼬,你應該能夠爲不同的模型使用不同的連接,但是因爲你需要一個貓鼬實例來定義一個模型,那麼你如何注入它?需求不斷地一遍又一遍地返回相同的實例。

試過以下,但都沒有工作。

console.log('deleting mongoose cache:',require.cache.mongoose=undefined); 
//or this one 
console.log('deleting mongoose cache:',delete require.cache.mongoose); 

所以問題是:如何在我的模塊中注入貓鼬,這些模塊需要獨特的數據庫?如果main設置了貓鼬實例和連接來注入模型,那麼我如何防止它一遍又一遍地創建同一個實例?

如果可以使用createConnection創建獨特的連接,那麼我會注入哪些模塊?有了這個連接,我不能創建模型,需要一個貓鼬實例。如果每個模型需要調用require來獲取它,那麼貓鼬是不可注射的。

回答

3

所以貓鼬使用單身模式。當您執行require("mongoose")時,您將看到每次在mongoose/lib/index.jssource code link here)的底部看到的構造函數的實例。 var mongoose = module.exports = exports = new Mongoose;

爲了得到獨一無二的情況下,使用此模式:

var singleton = require("mongoose") 
var unique = new singleton.constructor(); 
//now use "unique" just as you would "mongoose" 
+0

謝謝彼得,我看到貓鼬公開構造貓鼬:http://mongoosejs.com/docs/api.html#index_Mongoose-貓鼬我會試試這個。構造函數是JavaScript在function.prototype上給你的東西,但可以重新設置。 – HMR 2014-12-05 01:20:32