在Node.js中检测CTRL + C


87

我从另一个SO问题获得了此代码,但是node抱怨使用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();
  }
});

无论如何,它只是创建一个完全不响应的节点进程,什么也不做,第一个抱怨tty,然后抛出一个错误,第二个什么都不做,并禁用Node的native CTRL+ Chandler,所以当我打开它时,它甚至都不会退出节点按下。如何在Windows中成功处理Ctrl+ ?C

Answers:


168

如果您试图捕获中断信号SIGINT,则无需从键盘上进行读取。的process对象nodejs公开一个中断事件:

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

    if (i_should_exit)
        process.exit();
});

编辑:如果没有解决方法,则无法在Windows上运行。看这里


3
除非不是。至少不要在Windows上。
user3025492


11
对于未来的读者,此问题可在以下Windows窗口中得到解答:stackoverflow.com/a/14861513/2020425
Griffork 2014年

6

对于那些需要此功能的人,我发现它已经死了(npm结节,哈哈!)

作者还声称它可以在Windows上运行:

仅在兼容POSIX的系统上进行过测试。这是有关Windows信号的很好的讨论,显然,此问题已修复/映射。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.