我的node.js腳本從數據庫1中的表中讀取行,執行一些處理並將行寫入數據庫2中。什麼是在「完成所有事情」後退出node.js腳本的好方法
腳本應該在完成所有事情後退出。
我怎麼知道一切是否完成並退出節點呢?
如果我有這樣一個回調函數:
function exit_node() {
process.exit();
}
(編輯:在此期間,它變得越來越明顯,process.exit()也可以替換爲db.close() - 但這不是問題是在什麼時候準確地做到這一點,即如何以及在哪裏執行此回調。)
但是,將它附加到某處並不容易。在最後一次從db1中讀取之後不正確,因爲處理和寫入仍然必須發生。
將它附加到寫入db2並不容易,因爲它必須在最後一次寫入後進行連接,但每次寫入都是獨立的,並且不知道它是否是最後一次寫入。
它也可能理論上發生,最後寫入完成,但在此之前的另一個寫入仍在執行。
編輯:對不起,我可以看到這個問題的解釋是不完整的,可能令人困惑,但還是有人理解並有如下好的答案。請繼續閱讀評論和答案,它應該給你全貌。
編輯:我可以想到一些「阻塞」控制器機制。腳本的不同部分爲每個打開的「作業」向控制器添加阻止程序,並在作業完成後釋放它們,並且當沒有更多的作業程序存在時,控制器退出腳本。也許異步可以幫助:https://github.com/caolan/async
我也擔心這會炸燬代碼和邏輯不合理。
我不明白你的問題。當所有事情完成後,Node *都會退出。一旦沒有更多的異步調用正在進行 - 一旦你完成了你讀的最後一條記錄的處理,並且所有的寫操作都已經完成 - 那麼Node將自行退出;你不必做任何特別的事情。 –
@JoeWhite許多數據庫模塊將保持打開一個連接,保持進程運行。我認爲這個問題(糾正我,如果我錯了,SHernandez)是如何知道節點何時完成與數據庫相關的所有異步IO,以便他知道何時關閉數據庫連接以允許進程退出。 –
節點將不會退出,直到有一個或多個回調等待或事件發射器處於活動狀態。正如@BrandonTilley提到的,一些DB模塊保持DB連接打開(即EventEmitter),所以在完成查詢後應該關閉它。因此,在查詢的回調函數中寫入'db.close'(參見文檔),處理結果和節點將自行退出(不調用'process.exit')。 – elmigranto