Node.js上的MongoDB连接的最佳做法是什么?

这对我来说有点不清楚(我刚刚开始使用Node和Mongo),而且由于服务器的性能和紧张(我猜这是另一个问题,但是我会在post的结尾)。

所以,假设我正在用Node.js和Restify编写一个API,其中每个API端点都对应一个函数,我应该:

a)打开数据库连接并将其存储在全局variables中,然后在每个函数中使用它?
例:

// requires and so on leave me with a db var, assume {auto_reconnect: true} function openDB() { db.open(function(err, db) { // skip err handling and so on return db; } } var myOpenDB = openDB(); // use myOpenDB in every other function I have 

b)打开数据库连接,然后把所有东西放在一个巨大的closures?
例:

 // same as above db.open(function(err, db) { // do everything else here, for example: server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server) // use the db object here and so on }); } 

c)每次需要打开和closures数据库?
例:

 // again, same as above server.get('/api/something', function doSomething(req, res, next) { db.open(function(err, db) { // do something db.close(); }); }); server.post('/api/somethingelse', function doSomethingElse(req, res, next) { db.open(function(err, db) { // do something else db.close(); }); }); 

最后一个是我会用直觉去做的事情,但同时我也不完全放心。 它不是在Mongo服务器上施加太多的压力? 特别是当(我希望我能做到这一点),它会得到数百甚至数千次这样的电话吗?

先谢谢你。

我很喜欢MongoJS 。 它可以让你使用与默认命令行非常相似的方式使用Mongo,它只是官方Mongo驱动程序的一个包装。 您只打开一次数据库,并指定您将使用的集合。 如果使用--harmony-proxies运行Node,则甚至可以省略集合。

 var db = require('mongojs').connect('mydb', ['posts']); server.get('/posts', function (req, res) { db.posts.find(function (err, posts) { res.send(JSON.stringify(posts)); }); }); 
  • 选项A并不是一个好主意,因为不能保证在处理HTTP请求之前数据库将完成打开(这是不可能的)
  • 选项C也不理想,因为它不必要地打开和closures数据库连接

我喜欢处理这个问题的方式是使用延迟/承诺。 Node有许多不同的承诺库,但基本的想法是做这样的事情:

 var promise = new Promise(); db.open(function(err, db) { // handle err promise.resolve(db); }); server.get('/api/something', function doSomething(req, res, next) { promise.then(function(db) // do something }); }); 

我相信mongoose以一种模糊的方式处理连接。