2015-09-21 82 views
0

我在一個項目中有3個模塊:A,B,C;他們都使用Rethinkdb,這需要在初始化時進行異步r.connect調用。來自多個模塊的Node.js數據庫初始化

我想從命令行模塊A到B的呼叫;但是,儘管在require()上啓動r.connect,但B無法提供此服務,因爲在模塊A調用之前rethinkdb尚未加載。

這個代碼可以用什麼方法重構,這樣我可以在調用B之前確保所有的初始化都完成了嗎?

我試過用閉包來繞過模塊傳遞狀態;然而,由於僅r.connect是可作爲異步功能,這將採取以下形式:

r.connect(config.rethinkdb, function(err, connection) { 
    rconn = connection; 
    // all module requires 
    require("./moduleB")(rconn); 
    require("./moduleC")(rconn); 

    ...lotsacode... 
}); 

這感覺非常錯誤的。有更好的建議嗎?

+0

爲什麼不僅僅傳遞模塊需要用來建立連接的東西呢? –

+0

因爲那麼再次,我不能保證在整個模塊初始化之前將導出的函數調用*。例如執行管道:1,require(「B」); 2,r.init()...在模塊A中; 3,模塊B中的r.init; 4,模塊A中的b.myFunctionCall; 5,並在模塊B中崩潰,因爲r.init仍在等待處理。 –

回答

1

您可以使用承諾,並傳遞連接。事情是這樣的

r.connect(config.rethinkdb) 
.then(function(connection) { 
    //do some stuff here if you want 
    initWholeApp(connection) 
}) 

和內部initWholeApp連接,你可以把你的應用程序代碼。

你甚至可以它簡化爲

r.connect(config.rethinkdb) 
.then(initWholeApp) 

隨着initWholeApp是接受參數作爲建立連接的功能。

除此之外,您甚至可以在完成該查詢後運行連接上的每個查詢(只需確保關閉連接),或者使用RethinkDB連接池和支持它的驅動程序,如https://github.com/neumino/rethinkdbdash或推出自己的。