这对我来说有点不清楚(我刚刚开始使用Node和Mongo),而且由于服务器性能和应变(我认为这是另一个问题,但我会得到),这真的让我感到担忧到那个帖子的末尾)。
所以,假设我正在编写一个带有Node.js和Restify的API,其中每个API端点对应一个函数,我应该:
a)打开数据库连接并将其存储在全局变量中,然后在每个函数中使用它? 例如:
// 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)打开数据库连接,然后将所有内容放入一个巨大的闭包中? 例如:
// 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)每次需要时打开和关闭数据库?
例如:
// 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服务器带来太大的压力吗?特别是当(并且我希望我能做到这一点)它会得到数百个 - 如果不是数千个 - 这样的电话?
提前谢谢。
答案 0 :(得分:12)
我非常喜欢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));
});
});
答案 1 :(得分:6)
我喜欢处理此问题的方法是使用延迟/承诺。 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
});
});
我相信Mongoose以一种模糊的方式处理连接。