什么是对Node.js的MongoDB的连接,最好的做法?(What's the best

2019-07-30 19:08发布

这是这是一个有点不清楚,我(我刚开始使用节点和蒙戈),它真的对我而言,由于服务器的性能和应变(我的猜测是另一个问题,但我会在到达那个在帖子的末尾)。

因此,假设我写使用的是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
    });
}

三)开放,每次需要的时候关闭分贝?
例:

// 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();
    });
});

这最后一个是我会做出来的直觉,但在同一时间,我觉得不完全满意这样做。 难道不是把太多应变蒙戈服务器上? 特别是当(我希望我能去成是)它得到数百 - 如果不是数千 - 像这样的电话?

先感谢您。

Answer 1:

我喜欢MongoJS了很多。 它可以让你在一个非常类似的方式来默认命令行中使用蒙戈,它只是在官方蒙戈驱动的包装。 你只打开DB一次,并指定你将使用哪些集合。 如果您运行的节点,你甚至可以省略集合--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));
  });
});


Answer 2:

  • 选项A是不是一个好主意,因为没有保证的HTTP请求被处理之前,DB将完成开(授予此是非常不可能)
  • 选项C也并不理想,因为它无谓地打开和关闭数据库连接

我喜欢来处理这个问题的方法是使用deferreds /承诺。 现在有很多不同的承诺库可用于节点,但基本思路是做这样的事情:

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
    });
});

我相信,猫鼬处理中隐约类似于此的方式连接。



文章来源: What's the best practice for MongoDB connections on Node.js?