2013-10-30 21 views
1

基本上我想要像語法:是否有在終止明確應用程序觸發功能的方法嗎?

app.on("event:terminate", dumpFunc); 

因此,如果服務器已停止以任何理由,我可以轉儲數據到磁盤。

有沒有辦法做到這一點,或者我應該堅持在數據庫每隔幾秒鐘一個setTimeout記錄一切嗎?

像:

var badIdea = setTimeout(dumpFunc, 5000); 

function dumpFunc(stuff){ 
    //Do stuff 
    badIdea = setTimeout(dumpFunc, 5000); 
} 

我接受這個任何建議,但我需要在碰撞時的變量的狀態,堅持在下一負載。雖然我同意,但不要崩潰可能是最好的行動方式,目前這是不可避免的。

具體我需要在任一

  1. 一個SIGINT/SIGKILL保護到node由不符合期望和崩潰服務器時,服務器(CTRL + C類型的事件)
  2. 用戶輸入它尋找屬性undefinedNaN

理論上我可以包裹整個代碼庫在try/catch塊,以防止後者,但有時我們會遇到循環條件(我知道,我知道,試),或其他問題和進程需要被終止。

我不期待什麼奇蹟般地回來了我們在斷電或磁盤故障的情況下,但我們需要某種正常終止的選擇,所以我所有的耳朵。

回答

2

您可以在Domain運行整個應用程序,讓您可以捕獲錯誤。它的工作方式與捕獲未捕獲的異常類似,並且在不重新啓動進程(進程會泄露資源等)方面同樣不利。

var domain = require('domain'); 
var d = domain.create(); 
d.on('error', function(err) { 
    // log the error, store it, etc 
}); 
d.run(function() { 
    var express = require('express'); 
    var app = express(); 

    // application code here 

    app.listen(); 
}); 

搭上SIGINT,你會做這樣的事情:

process.on('SIGINT', function() { 
    // caught an interrupt signal 
}); 

至於SIGKILL,它是不能被捕獲的信號。

1

您可以使用下面的代碼:

process.on('uncaughtException', function (err) { 
    console.log("Error packing", err); 
}); 

它會使你的應用程序uncrashable。但是,我認爲這不會讓你免於死亡信號。

+0

的感謝!你在正確的軌道上,節點的[文件](http://nodejs.org/api/process.html#process_event_exit)有一個'sigint'太盛會!這是非常棒的閱讀。 –

相關問題