我正在寻找有关在node.js应用程序中创建数据库连接的设计模式的帮助。
这似乎很明显:
模块1:
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);
}
};
模块2:
exports.do_something = function () {
module1.get_db(function (err, conn) {
if (err == null) {
// continue using query
}
});
};
对于想要使用回调要求获得数据库连接的每个人来说,惩罚似乎很痛苦。
我可以这样做:
模块1:
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;
};
这使得获取数据库连接简单快速,但意味着我们必须在节点启动时“等待”才能建立连接。
哪个更好的设计?有没有更好的做事方式?
答案 0 :(得分:8)
mydb.js
模块:
var db
exports.db = function() {
if (db === null) {
db = dblibrary.createClient()
}
return db
}
其他模块:
var db = require('mydb').db()
...
db.query(...)
这会在启动时创建一次DB客户端实例。我喜欢这个解决方案,因为创建代码封装在一个单独的模块中,其他模块可以通过一个require()语句访问客户端。
答案 1 :(得分:4)
我见过的最佳答案是:
在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 :(得分:0)
我写connect-once只是为了解决这类问题。这个模块有两个主要目标:
您可以查看express-mongo-db和express-mongoose-db作为使用示例。