Node.js上MongoDB连接的最佳实践是什么?

art*_*ovm 33 mongodb node.js restify

这对我来说有点不清楚(我刚刚开始使用Node和Mongo),而且由于服务器性能和应变(我认为这是另一个问题,我真的很担心,但我会在帖子的结尾).

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

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

// 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
Run Code Online (Sandbox Code Playgroud)

b)打开数据库连接,然后将所有内容放在一个巨大的闭包中?
例:

// 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
    });
}
Run Code Online (Sandbox Code Playgroud)

c)每次需要时打开和关闭数据库?
例:

// 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();
    });
});
Run Code Online (Sandbox Code Playgroud)

最后一个是我凭直觉做的,但与此同时,我觉得这样做并不完全舒服.它不会给Mongo服务器带来太大的压力吗?特别是当(我希望我能做到这一点)它会得到数百个 - 如果不是数千个 - 这样的电话?

先感谢您.

jua*_*azo 12

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

var db = require('mongojs').connect('mydb', ['posts']);

server.get('/posts', function (req, res) {
  db.posts.find(function (err, posts) {
    res.send(JSON.stringify(posts));
  });
});
Run Code Online (Sandbox Code Playgroud)


sct*_*lsn 6

  • 选项A不是一个好主意,因为无法保证在处理HTTP请求之前数据库将完成打开(授予此功能的可能性很小)
  • 选项C也不理想,因为它不必要地打开和关闭数据库连接

我喜欢处理这个的方式是使用deferreds/promises.Node有很多不同的promise库,但基本的想法是做这样的事情:

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
    });
});
Run Code Online (Sandbox Code Playgroud)

我相信Mongoose以一种模糊的方式处理连接.