让几个模块使用相同的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在无法访问数据库时所做的工作。 显示失败鲸鱼页面或退出该过程。
- Express.js:如何使用基于NODE_ENV的不同中间件?
- 为什么没有新版本的节点从请求体中删除__proto__?
- 没有命令行实用程序的Express /节点窗口7
- 哪个hogan.js模板包使用express.js?
- 模型定义之前定义的中间件,级联删除失败,出现中间件被绕过
- 如果有一个与Node.js / Express的活动用户会话,如何更改HTML内容?
- 从express中redirect到react-router
- Express js从URL的根目录获取参数(不像req.params那么简单)
- 在SPA(单页面应用程序)中使用node.js + express.js在服务器端dynamic生成内容的SEO