2012-02-08 14 views
9

我正在處理一個節點項目,我想在退出時將一些內存寫入文件。我覺得它很簡單:在Windows上處理Node.js中的CTRL + C事件

process.on('exit', function() { 
//handle your on exit code 
console.log("Exiting, have a nice day"); 
}); 

但是,當收到CTRL + C時,此代碼不會執行(在Windows上)。鑑於這是退出節點的事實上的方式,這似乎有點問題。

在這一點上我試圖處理信號代替,這將導致錯誤(在(「SIGINT」,...)。):

node.js:218 throw e; // process.nextTick error, or 'error' event on first tick ^Error: No such module at EventEmitter. (node.js:403:27) at Object. (C:\Users\Mike\workspace\NodeDev\src\server.js:5:9) at Module._compile (module.js:434:26) at Object..js (module.js:452:10) at Module.load (module.js:353:32) at Function._load (module.js:310:12) at Array.0 (module.js:472:10) at EventEmitter._tickCallback (node.js:209:41)

開了一個快速谷歌和it appears節點簡單地不處理Windows上的信號,並且CTRL + C實際上不會觸發「退出」事件。上述錯誤不應該在* Nix系統上退出。

但是,關閉Windows平臺對我來說不是一個有效的選擇,所以我需要一種解決方法。有沒有辦法處理由用戶按CTRL + C終止腳本導致的節點中的退出事件?

回答

11

我用這段代碼來監聽密鑰。它似乎也適用於Windows上的CTRL + C

但是,它只能作爲CTRL + C作爲關鍵組合,而不是其他任何東西。當然,您可以將函數綁定到process.on("exit",並在下面的if塊中調用它。

var tty = require("tty"); 

process.openStdin().on("keypress", function(chunk, key) { 
    if(key && key.name === "c" && key.ctrl) { 
    console.log("bye bye"); 
    process.exit(); 
    } 
}); 

tty.setRawMode(true); 
+1

不錯的解決方案。感覺有點......骯髒,但是,解決問題的方法往往是這樣!謝謝。 – Serapth 2012-02-10 14:49:43