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

我正在build立一个更大的networking应用程序,路线被分成不同的文件。 所有的路由都需要连接到数据库,因此他们都需要mongoskin,这是我用于MongoDb的模块。 喜欢这个:

var mongo = require('mongoskin'); 

但不久之后,我才意识到只需要蒙戈皮就不足以让路线跟数据库交谈了。 因为在我的主app.js文件中,我也做了额外的“configuration”。

 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'); 

我需要这个数据库对象被共享,以及…

我第一次尝试将路由文件包裹在一个带参数的导出函数中。 这个参数是在我的主要app.js中需要routes.js时传入的。 这工作得很好,但我不是很喜欢这个解决scheme…我觉得有点混乱。

我现在使用的第二种方法是为整个数据库对象创build一个单独的模块。

 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(); 

问题:这是否是共享数据库连接的良好工作解决scheme(也可能是其他类似的方式)? 如果你能看到这个问题,请告诉我…

总体而言,我认为这很好,但是你可以简化为:

 //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的顶级代码将运行并连接到数据库。 当其他模块需要时,他们将访问数据库,而不需要重新运行顶层代码并重新连接。

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

  • 从某些configuration系统(环境variables或辅助模块)获取数据库连接详细信息
  • 更健壮的日志
  • 在应用程序运行时,优雅地处理断开连接和重新连接
  • 当Web应用程序启动时,优雅地处理db被closures
  • 连接/重新连接的重试/退避逻辑
  • 确定webapp在无法访问数据库时所做的工作。 显示失败鲸鱼页面或退出该过程。