我重构了一些代码,将所有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事件,我怎么能确定连接是否已经打开?
是否有更好的模式来集中管理多个连接?
答案 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");
}
如果您看到更好的方式,请发表评论或提供答案。我仍然希望听到其他人如何在不重建连接的情况下管理连接。