在Node.js中检测CTRL + C

我从一个不同的SO问题得到这个代码,但节点抱怨使用process.stdin.setRawMode而不是tty,所以我改变了它。

之前:

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); 

后:

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

在任何情况下,只是创build一个完全没有响应的节点进程,什么也不做,第一个抱怨tty ,然后抛出一个错误,第二个什么也不做,禁用Node的本地CTRL + C处理程序,所以它甚至不退出当我按下它的节点。 如何在Windows中成功处理Ctrl + C

如果您要捕获中断信号SIGINT ,则不需要从键盘读取数据。 nodejsprocess对象公开了一个中断事件:

 process.on('SIGINT', function() { console.log("Caught interrupt signal"); if (i_should_exit) process.exit(); }); 

编辑 :不适用于没有解决方法的Windows。 看这里

对于那些需要function的人来说,我发现了死亡(npm结节,呵呵!) 。

作者还声称它在Windows上工作:

它只在POSIX兼容系统上testing过。 这里是关于Windows信号的一个很好的讨论,显然,这已经被修复/映射。

我可以确认CTRL + C在win32上工作(是的,我很惊讶)。

由于setRawMode()调用,该过程似乎没有响应。

这个调用基本上意味着你需要处理所有的按键,包括默认的按键(这就是为什么Ctrl + C不能工作了),“原始”input直接传递到你的程序中。

试试这个代码(不在Windows上testing):

 process.stdin.setRawMode(true); process.stdin.on('data', function(b) { if (b[0] === 3) { process.stdin.setRawMode(false) process.exit() } })