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 время запуска для установления соединения.
Какой лучший дизайн? Есть ли лучший способ сделать что-то?
Ответы
Ответ 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 в качестве примеров использования.