шаблон дизайна node.js для однократного создания соединения с БД - PullRequest
12 голосов
/ 08 июня 2011

Мне нужна помощь с шаблоном проектирования для создания соединения с базой данных в моем приложении 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
    }
  });
};

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 08 июня 2011

mydb.js модуль:

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

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

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

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

4 голосов
/ 13 июня 2011

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

в start.js:

    function init_done() {

      app.listen(8080);

    }


init_databases(init_done);

в database.js:

init_databases(init_done_cb) {

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

    if (err == null) init_done_cb();

  });
}

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

0 голосов
/ 08 августа 2014

Я написал connect-Once просто для решения такого рода проблем. Этот модуль преследует две основные цели:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...