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启动。

我写了连接一次只是为了解决这类问题。 这个模块有两个主要的目标:

  1. 连接应该在请求到达之前被初始化
  2. 连接应该初始化一次,即使有多个请求同时进入

你可以看看express-mongo-db和express-mongoose-db作为用法的例子。