Подтвердить что ты не робот

Какая наилучшая практика для соединений MongoDB на Node.js?

Это то, что немного непонятно для меня (я только начинаю с Node и Mongo), и это действительно касается меня из-за производительности и деформации сервера (что, я думаю, это другой вопрос, дойдем до этого в конце сообщения).

Итак, предполагая, что я пишу API с Node.js и Restify, где каждая конечная точка 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

b) откройте соединение db, а затем просто поместите все в одно гигантское закрытие

Пример:

// 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) открыть и закрыть db каждый раз, когда это необходимо?
Пример:

// 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? Особенно, когда (и я надеюсь, что мне это удается), он получает сотни, если не тысячи, таких звонков?

Спасибо заранее.

4b9b3361

Ответ 1

Мне нравится 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));
  });
});

Ответ 2

  • Вариант A не является отличной идеей, так как нет гарантии, что БД будет завершена до того, как будет обработан HTTP-запрос (предоставлено это очень маловероятно).
  • Опция C также не идеальна, поскольку она бесполезно открывает и закрывает соединение с БД

Способ, которым мне нравится обрабатывать это, заключается в использовании отложенных / promises. Для 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 обрабатывает соединения таким образом, который смутно напоминает это.