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

Node.js шаблон проектирования для создания соединения db один раз

Я ищу помощь с шаблоном проектирования для создания соединения с базой данных в моем приложении node.js.

Кажется очевидным:

module1:

var db;
exports.get_db = function(callback) {

  if (db == null) {
    dblibrary.create(connection_params, function(error, conn) {
      if (error == null) {
        db = conn;
        callback(null, db);
      }
    });
  } else {
    callback(null, db);
  }
};

module2:

exports.do_something = function () {
  module1.get_db(function (err, conn) {
    if (err == null) {
      // continue using query
    }
  });
};

Кажется болезненным наказывать каждого человека, который хочет получить соединение db с требованием использования обратного вызова.

Я мог бы сделать это:

module1:

var db;

dblibrary.create_connection(connection_params, function (err, conn) {

  if (err != null) {
     console.log("can't create connection");
     console.log(err);
     process.exit();
  } else {
     db = conn;
  }
});

exports.get_db = function() {
  return db;
};

Это делает так, чтобы соединение db было простым и быстрым, но мы должны "ждать" в node время запуска для установления соединения.

Какой лучший дизайн? Есть ли лучший способ сделать что-то?

4b9b3361

Ответ 1

Лучший ответ, который я видел для этого:

в start.js:

    function init_done() {

      app.listen(8080);

    }


init_databases(init_done);

в databases.js:

init_databases(init_done_cb) {

  db.create_async(/* connect data */ , function (err, res) {

    if (err == null) init_done_cb();

  });
}

Таким образом вы можете запустить асинхронный запуск сервера базы данных без этого неудобного/опасного периода ожидания.

Ответ 2

mydb.js модуль:

var db
exports.db = function() {
    if (db === null) {
        db = dblibrary.createClient()
    }
    return db
}

Другие модули:

var db = require('mydb').db()
...
db.query(...)

Это создает экземпляр клиента DB один раз при запуске. Мне нравится это решение, потому что код создания инкапсулируется в отдельный модуль, а другие модули могут получить доступ к клиенту с помощью инструкции require().

Ответ 3

Я написал connect-once только для решения таких проблем. Для этого есть два основных цели:

  • Соединение должно быть инициализировано до поступления запроса
  • Соединение должно быть инициализировано один раз, даже если одновременно поступает несколько запросов

Вы можете посмотреть express-mongo-db и express-mongoose-db в качестве примеров использования.