Что такое эквивалент Windows process.on('SIGINT') в node.js?
Я следую инструкциям здесь (прослушивание событий SIGINT), чтобы изящно закрыть мое приложение node.js, размещенное в Windows 8, в ответ на Ctrl- C или выключение сервера.
Но 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" )
})
Есть ли эквивалентное событие SIGINT
в Windows?
Ответы
Ответ 1
Вы должны использовать модуль 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();
});
Ответ 2
Если вам не нужен импорт "readline" для других задач, я бы предложил импортировать "readline" после того, как программа проверила, что она работает в Windows. Кроме того, для тех, кто может не знать, это работает как на 32-битных, так и на Windows 64-разрядных системах (которые вернут ключевое слово "win32" ). Спасибо за это решение Gabriel.
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();
});
Ответ 3
В настоящее время поддержка node для захвата событий управления консолью Windows по-прежнему отсутствует, поэтому нет эквивалентов сигналов 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();
}
});
Ответ 4
Я не уверен, когда, но на node 8.x и в Windows 10 исходный код вопроса просто работает сейчас.
![введите описание изображения здесь]()
также работает с командной строкой Windows.
Ответ 5
Так как node.js 0.8 событие keypress
больше не существует. Однако есть пакет npm, называемый keypress, который повторяет событие.
Установить с помощью 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");
}
});
}