2012-02-08 15 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