【问题标题】:Let several modules use the same mongo instance让几个模块使用同一个 mongo 实例
【发布时间】:2014-08-22 22:15:41
【问题描述】:

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

var mongo = require('mongoskin');

但不久之后,我意识到只需要 mongoskin 不足以让路由能够与 db 对话。因为在我的主 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();

问题:这种方法是否是共享数据库连接(以及其他类似方式)的有效解决方案?如果您对此有任何问题,请告诉我...

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    总的来说,我认为这很好,但您可以将其简化为:

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

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

    • 从某些配置系统(环境变量或帮助模块)获取数据库连接详细信息
    • 更强大的日志记录
    • 在应用运行时优雅地处理断开连接和重新连接
    • 在 Web 应用启动时优雅地处理数据库关闭
    • 围绕连接/重新连接的重试/退避逻辑
    • 决定 web 应用程序在无法访问数据库时执行的操作。显示失败鲸鱼页面或退出流程。

    【讨论】:

    • 太好了,非常感谢提供额外的生产就绪提示。顺便说一句,我之前没听过“失败鲸鱼”这个词......不得不谷歌它=D
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 2017-05-05
    • 2016-03-22
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多