2012-03-13 72 views
22

我使用Mongoose來管理Mongo數據庫。我的連接文件是相當簡單:與mongoose/node.js共享數據庫連接參數的最佳方法

var mongoose = require('mongoose') 

mongoose.connection.on("open", function(){ 
    console.log("Connection opened to mongodb at %s", config.db.uri) 
}); 
console.log("Connecting to %s", config.db.uri) 
mongoose.connect(config.db.uri) 

global.mongoose = mongoose 

然後在我的app.js我只是

require('./database) 

和「貓鼬」變量是全球範圍內提供。我寧願不使用全局變量(至少不是直接)。是否有更好的方法通過單例模式或其他方法跨節點共享數據庫連接變量(我使用express.js)?

+0

Mayby重複此問題http://stackoverflow.com/questions/9651066/how-can-i-structure-my-express-app-where-i-only-need-to-open-a-mongodb-connectio/ 9653519#9653519 – 2012-03-13 22:08:25

回答

29

我只需在我的app.js文件中執行以下操作:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://address_to_host:port/db_name'); 
modelSchema = require('./models/yourmodelname').YourModelName; 
mongoose.model('YourModelName', modelSchema); 
// TODO: write the mongoose.model(...) command for any other models you have. 

在這一點上,需要該模型的訪問可以做的任何文件:

var mongoose = require('mongoose'); 
YourModelName = mongoose.model('YourModelName'); 

最後,在你的模型,你可以有正常寫入則文件在底部導出:

module.exports.YourModelName = YourModelName; 

我不知道這是否是最好的最棒的解決方案(剛開始在約2天前圍繞導出模塊包裝我的頭),但它確實有效。也許有人可以評論,如果這是一個好辦法做到這一點。

+0

哦,好吧,所以我不需要一個指向「貓鼬」的全局變量,因爲我可以在需要時指定它。 – typeoneerror 2012-03-13 20:06:33

+0

是的,據我所知express也會緩存你加載的模塊。所以一旦貓鼬被加載一次,它不會像快遞一樣從頭開始爲每個需求重新加載它。 如果有人可以肯定地確認,但我確信自己在過去的某個地方閱讀過,那將會很酷。 – AntelopeSalad 2012-03-13 20:12:17

+0

我不知道高速緩存,但我知道需要緩存它加載的模塊。 – 2012-03-23 03:22:40

6

,如果你遵循CommonJS的出口

exports.mongoose = mongoose 

讓我們說你的模塊名稱是connection.js

可以要求

var mongoose = require('connection.js') 

你可以使用貓鼬連接

2

我一般纏上了我的模特這樣

var MySchema = (function(){ 
//Other schema stuff 

//Public methods 
GetIdentifier = function() { 
return Id; 
}; 

GetSchema = function() { 
return UserSchema; 
}; 

return this; 
})(); 

if (typeof module !== 'undefined' && module.exports) { 
exports.Schema = MySchema; 
} 

而在我的主類,我這樣做var schema = require('./schema.js').Schema;和調用connect,或之後的createConnection調用conn.model(schema.GetIdentifier(), schema.GetSchema())當然。這允許我將模式插入標準的一組方法中。這種泛化是很好的,因爲在掌握了連接和錯誤處理之後,您可以專注於您的模式。我還使用插件擴展了模式,並允許我與其他模式共享插件。

我期待着看看有些機構是否做得更好,但看不到一個好的模式,而且我對Mongo來說還算新手。

我希望這會有所幫助。