让几个模块使用相同的mongo实例

时间:2014-08-22 13:31:46

标签: javascript node.js express

我正在构建一个更大的Web应用程序,其中路由被分成单独的文件。 所有路由都需要连接到db,因此所有路由都需要mongoskin,这是我用于MongoDb的模块。像这样:

var mongo = require('mongoskin');

但是在我意识到只需要mongoskin不足以使路线能够与数据库通信之后不久。因为在我的主app.js文件中,我还进行了额外的"配置"。

db = mongo.db('mongodb://localhost/dbName', {native_parser:true});
db.open(function(err) {
if (!err) {
    console.log('Connected to mongodb://localhost/dbName');
}
});
db.bind('clients');
db.bind('invoices');

我需要共享此db对象...

我的第一次尝试是将路由文件包装在带有参数的导出函数中。当我在主app.js中需要routes.js时传入此参数。这很好,但我并不是真的喜欢这个解决方案......我觉得它变得有点乱。

我现在正在使用的第二种方法是创建整个db对象的单独模块。

var mongo = require('mongoskin');

var db = null;

module.exports =  {
    initAndGetDb: function () {
        db = mongo.db('mongodb://localhost/dbName', {native_parser:true});
        db.open(function(err) {
            if (!err) {
                console.log('Connected to mongodb://localhost/dbName');
            }
        });
        db.bind('clients');
        db.bind('invoices');

        return(db);
    },
    getDb: function () {
        return(db);
    }
};

在我的主app.js

var db = require('./db').initAndGetDb();

在我的routes.js

var db = require('../db').getDb();

问题:这种方法是一种很好的工作解决方案,用于共享数据库连接(以及其他类似的方式)吗?如果你能看到任何问题,请告诉我......

1 个答案:

答案 0 :(得分:2)

总的来说,我觉得这很好,但你可以将它简化为:

//your db.js module
var mongo = require('mongoskin');
var db = mongo.db('mongodb://localhost/dbName', {native_parser:true});
db.bind('clients');
db.bind('invoices');
db.open(function(err) {
  if (err) {
    console.error('Could not connect to db', err);
    return;
  }
  console.log('Connected to mongodb://localhost/dbName');
});
module.exports = db;

第一次代码执行require("./db");时,db.js中的顶级代码将运行并连接到数据库。当其他模块需要它时,他们将无需重新运行顶级代码并重新连接即可访问数据库。

请注意,要真正做好生产准备,您需要通过以下方式加强:

  • 从某些配置系统(环境变量或辅助模块)获取数据库连接详细信息
  • 更强大的日志记录
  • 在应用程序运行时正常处理断开连接和重新连接
  • 在网络应用启动时正常处理数据库
  • 关于连接/重新连接的重试/退避逻辑
  • 确定无法访问数据库时webapp的功能。显示失败的鲸鱼页面或退出该过程。