2012-03-13 73 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来说还算新手。

我希望这会有所帮助。