Обнаружение CTRL + C в Node.js
Я получил этот код из другого вопроса 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();
}
});
В любом случае он просто создает абсолютно невосприимчивый node процесс, который ничего не делает, с первым жалобой на tty
, а затем бросает ошибку, а второй просто ничего не делает и отключает node native CTRL + C, поэтому он даже не выходит из node, когда я его нажимаю. Как я могу успешно обрабатывать CTRL + C в Windows?
Ответы
Ответ 1
Если вы пытаетесь поймать сигнал прерывания SIGINT
, вам не нужно читать с клавиатуры. Объект process
объекта nodejs
предоставляет событие прерывания:
process.on('SIGINT', function() {
console.log("Caught interrupt signal");
if (i_should_exit)
process.exit();
});
Изменить: не работает в Windows без обходного пути. Смотрите здесь
Ответ 2
Для тех, кому нужна функциональность, я нашел death (npm nodule, hah!).
Автор также утверждает, что он работает над окнами:
Он был протестирован только на совместимых с POSIX системах. Здесь хорошая дискуссия по Windows сигнализирует, по-видимому, что это было исправлено/отображено.
Я могу подтвердить CTRL + C работает на win32 (да, я удивлен).
Ответ 3
Процесс кажется невосприимчивым из-за вызова setRawMode()
.
Этот вызов по существу означает, что вам нужно обрабатывать все нажатия клавиш, включая значения по умолчанию (вот почему Ctrl + C больше не будет работать), вход "raw" напрямую передается в вашу программу.
Попробуйте использовать этот код (не тестируется в окнах):
process.stdin.setRawMode(true);
process.stdin.on('data', function(b) {
if (b[0] === 3) {
process.stdin.setRawMode(false)
process.exit()
}
})