什么是node.js中的process.on('SIGINT')的Windows等价物?

我按照这里的指导(侦听SIGINT事件)正常closures我的Windows-8托pipe的node.js应用程序,以响应Ctrl-C或服务器closures。

但Windows没有SIGINT 。 我也尝试了process.on('exit') ,但是这似乎迟迟不能做任何事情。

在Windows上,这段代码给了我: 错误:没有这样的模块

 process.on( 'SIGINT', function() { console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" ) // wish this worked on Windows process.exit( ) }) 

在Windows上,这个代码运行,但为时尚晚了,

 process.on( 'exit', function() { console.log( "never see this log message" ) }) 

Windows上有SIGINT等效事件吗?

您必须使用readline模块并侦听SIGINT事件:

http://nodejs.org/api/readline.html#readline_event_sigint

 if (process.platform === "win32") { var rl = require("readline").createInterface({ input: process.stdin, output: process.stdout }); rl.on("SIGINT", function () { process.emit("SIGINT"); }); } process.on("SIGINT", function () { //graceful shutdown process.exit(); }); 

除非你需要为其他任务导入“readline”,否则一旦程序validation它在Windows上运行,我会build议导入“readline”。 此外,对于那些可能不知道的人来说,这个方法可以在Windows 32位和Windows 64位系统上运行(这将返回关键字“win32”)。 感谢这个解决schemeGabriel。

 if (process.platform === "win32") { require("readline") .createInterface({ input: process.stdin, output: process.stdout }) .on("SIGINT", function () { process.emit("SIGINT"); }); } process.on("SIGINT", function () { // graceful shutdown process.exit(); }); 

目前,在捕获窗口控制台控制事件的节点中仍然没有支持,所以POSIX信号没有等价物:

https://github.com/joyent/node/issues/1553

但是, tty模块文档提供了一个捕获按键的机制的例子,以启动一个正常关机,但是这只对ctrl + c有效

 var tty = require('tty'); process.stdin.resume(); tty.setRawMode(true); process.stdin.on('keypress', function(char, key) { if (key && key.ctrl && key.name == 'c') { console.log('graceful exit of process %d', process.pid); process.exit(); } }); 

我不知道什么时候,但是在节点8.x和Windows 10上,原始问题代码现在可以工作了。

在这里输入图像说明

也适用于Windows命令提示符。

由于node.js 0.8 keypress事件不再存在。 然而有一个叫做keypress的npm包重新实现了这个事件。

使用npm install keypress ,然后执行如下操作:

 // Windows doesn't use POSIX signals if (process.platform === "win32") { const keypress = require("keypress"); keypress(process.stdin); process.stdin.resume(); process.stdin.setRawMode(true); process.stdin.setEncoding("utf8"); process.stdin.on("keypress", function(char, key) { if (key && key.ctrl && key.name == "c") { // Behave like a SIGUSR2 process.emit("SIGUSR2"); } else if (key && key.ctrl && key.name == "r") { // Behave like a SIGHUP process.emit("SIGHUP"); } }); }