让几个模块使用相同的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在无法访问数据库时所做的工作。 显示失败鲸鱼页面或退出该过程。
- 在mongodb中使用现有的字段作为objectId来创build带有节点的REST API并expression?
- 如何使用SCSS和Express? (Node.js的)
- node-express errror:express deprecated res.send(status):use res.sendStatus(status)instead
- 使用express bodyParser之后,request.body未定义
- mongoose保存不正确的值
- Mongoose Model.save()在从node.js应用程序调用时挂起
- validation我的node.js实例是开发还是生产
- 如何在node.js中使用express.static显示index.html之前显示login页面
- 手推车/快递/吞食无法查找视图