node.jsdevise一次创build数据库连接的模式
我正在寻找关于在我的node.js应用程序中创build数据库连接的devise模式的帮助。
这似乎很明显:
模块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 } }); };
惩罚每个想要使用callback的db连接的人是很痛苦的。
我可以这样做:
模块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; };
这使得获得数据库连接简单而快速,但意味着我们必须在节点启动时“等待”build立连接。
哪个devise更好? 有没有更好的做事方式?
mydb.js
模块:
var db exports.db = function() { if (db === null) { db = dblibrary.createClient() } return db }
其他模块:
var db = require('mydb').db() ... db.query(...)
这将在启动时创build一次数据库客户端实例。 我喜欢这个解决scheme,因为创build代码封装在一个单独的模块中,其他模块可以通过一个require()语句访问客户端。
我见过的最佳答案是:
在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(); }); }
通过这种方式,您可以在不尴尬/危险的等待期间执行数据库服务器的asynchronous启动。
我写了连接一次只是为了解决这类问题。 这个模块有两个主要的目标:
- 连接应该在请求到达之前被初始化
- 连接应该初始化一次,即使有多个请求同时进入
你可以看看express-mongo-db和express-mongoose-db作为用法的例子。