构建Mongoose连接模块的更好方法

时间:2014-01-17 14:42:01

标签: node.js mongoose

我重构了一些代码,将所有mongoose.createConnection(...)放在一个文件中。然后,在使用与指定的各种数据库的连接的其他文件中,此文件为required。这些连接是懒惰创建的,可以在http服务器和实用程序脚本中使用。

连接文件如下所示:

var mongoose = require("mongoose");
var serverString = "mongodb://localhost:27017";
var userDBString = "/USER";
var customerDBString = "/CUSTOMER";

var userConnection = null;
exports.getUserConnection = function () {
    if (userConnection === null) {
        userConnection = mongoose.createConnection(serverString + userDBString, {server: { poolSize: 4 }});
    }
    return userConnection;
};

var customerConnection = null;
exports.getCustomerConnection = function () {
    if (customerConnection === null) {
        customerConnection = mongoose.createConnection(serverString + customerDBString, { server: { poolSize: 4 }});
    }
    return customerConnection;
};

我的模型存储在一个单独的文件中(基于他们的数据库),看起来有点像这样:

exports.UserSchema = UserSchema; //Just assume I know how to define a valid schema
exports.UserModel = connection.getUserConnection().model("User", UserSchema);

稍后,我使用getUserConnection()来引用我创建的连接以实际处理模型。

TL; DR

在使用此连接格式的实用程序中,我必须调用

connection.getUserConnection().on("open", function() {

  logger.info("Opened User DB");
  //Do What I Need To Do

});

在某些情况下,任务处理器可能已经广播了open事件。在某些情况下,它不会保证已经发生。我注意到如果连接没有打开(特别是dropCollection),它就不会排队工作,所以我觉得卡住了。

如果在任务处理器运行之前我不能依赖于订阅open事件,我怎么能确定连接是否已经打开?

是否有更好的模式来集中管理多个连接?

1 个答案:

答案 0 :(得分:0)

我可以回答我自己的一部分问题

  

在继续操作之前,如何确定连接已打开   鉴于我不能依赖于订阅开放事件之前   任务处理器运行?

if (connection.getUserConnection().readyState!==1) {
    logger.info("User connection was not open yet. Adding open listener");
    connection.getSR26Connection().on("open", function () {
        logger.info("User open event received");
        doStuff();
    });
} else {
    logger.info("User is already open.");
    doStuff();
}

function doStuff() {
  logger.info("Doing stuff");
}

如果您看到更好的方式,请发表评论或提供答案。我仍然希望听到其他人如何在不重建连接的情况下管理连接。