javascript - 让几个模块使用同一个mongo实例

标签 javascript node.js express

我正在构建一个更大的网络应用程序,其中的路线被分成单独的文件。 所有路由都需要连接到数据库,因此它们都需要 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/

相关文章:

javascript - 将局部变量传递给另一个函数?

javascript - 结果已声明,但其值从未在 ionic 3 上读取

node.js - 在 Azure Web App 中访问 SSL 证书

javascript - TypeError : Object. 条目不是函数

node.js - 有什么方法可以减少在 nodejs 中获取数据和缓存的并发请求量?

javascript - Angular 2 接口(interface)

javascript - react Prop : Unable to access key in object in array with index both passed with props

javascript - 在 javascript 中对数组文字调用 forEach 时出错

node.js - 使用 Node Js 的 AWS Lambda 在 http.request() 上给出 "connect ETIMEDOUT"

javascript - ejs和express公共(public)和私有(private)路线的查看页面