2015-02-08 189 views
2

代碼:析構函數的NodeJS

function terminator(sig) 
{ 
    if (typeof sig === "string") 
    { 
    console.log('Received %s - terminating Node server ...', sig); 
    process.exit(1); 
    }; 
    console.log('Node server stopped.'); 
}; 

process.on('exit', function() { terminator(); }); 

function terminatorSetup(element, index, array) 
{ 
    process.on(element, function() { terminator(element); }); 
}; 

['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT', 'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGPIPE', 'SIGTERM'].forEach(terminatorSetup); 

不知怎的,這並不工作在Windows上,使用Ctrl + C退出控制檯上不顯示任何信息,但是當我process.on(element, ...);前插入console.log(element);它工作得很好。我錯過了什麼?沒有什麼我在那裏應該是異步afaik。

回答

1

Windows does not support signals。因此,您的信號處理程序不會被觸發,而是調用您的處理程序。由於在該處理程序中,您不需要任何參數即可調用terminator(),因此sig是一個字符串的檢查失敗,因此不會打印任何內容。

還要注意,在exit事件中調用process.exit()是多餘的 - 該過程即將退出並且沒有停止。我明白,你想使用這種邏輯的信號處理程序的過程中不需要退出的所有情況下,但因爲你不能在Windows上使用信號... ...

+0

不應該打印'節點服務器已停止.' nontheless?另外,當我進入控制檯行時,它確實打印出SIGINT被觸發。 – sollniss 2015-02-08 22:50:11

+0

嗯,你是對的,我錯過了那條線。儘管如此,信號真的不能在Windows上使用 - 您是使用Cygwin還是一些這樣的posix環境仿真...? – 2015-02-08 22:57:59

+0

哦,是的。我做 ... – sollniss 2015-02-09 00:13:10