我重構了一些代碼,將我所有的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;
};
我的模型存儲在一個單獨的文件(根據其DB),看起來有點像這樣:
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
),它不排隊工作,所以我覺得卡住了。
由於在任務處理器運行之前無法依賴預訂打開的事件,我怎麼能確定連接在繼續之前是開放的呢?
是否有更好的模式來集中管理多個連接?
因此,如果您只是使用貓鼬模型與數據庫交互,貓鼬會在內部排隊操作,直到連接建立。是否有一個特定的原因,你不能按預期使用它,並覺得你需要編寫你自己的替代方法? –
我對排隊有同樣的印象 - 我發現它沒有排隊我調用collection.db對象的東西(在我的例子中爲dropCollection)。這可能是唯一的例外,在這種情況下,我可以忍受它,但...我真的想測試連接對象,看它是否是開放的,如果不是,註冊'open'事件監聽器。 –
我可能剛剛回答了我自己的問題。 db打開時connection.readyState === 1嗎? –