我正在构建一个更大的网络应用程序,其中的路线被分成单独的文件。 所有路由都需要连接到数据库,因此它们都需要 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');
我还需要共享这个数据库对象...
我的第一次尝试是将路由文件包装在一个带有参数的导出函数中。当我在主 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();
问题:这种方法是否是共享数据库连接(以及可能以类似方式进行的其他操作)的有效解决方案?如果您发现任何问题,请告诉我...
最佳答案
总的来说,我认为这很好,但您可以将其简化为:
//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
中的顶级代码将运行并连接到数据库。当其他模块需要它时,它们将可以访问数据库,而无需重新运行顶级代码并重新连接。
请注意,要真正为生产做好准备,您需要通过以下方式增强它:
- 从某些配置系统(env vars 或辅助模块)获取数据库连接详细信息
- 更强大的日志记录
- 在应用程序运行时优雅地处理断开连接和重新连接
- 在网络应用程序启动时优雅地处理数据库关闭
- 围绕连接/重新连接的重试/退避逻辑
- 决定网络应用程序在无法访问数据库时执行的操作。显示失败鲸鱼页面或退出流程。
关于javascript - 让几个模块使用同一个mongo实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25448269/