Обнаружение CTRL + C в Node.js

87

Я получил этот код из другого вопроса 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();
  }
});

В любом случае, он просто создает полностью неотзывчивый процесс узла, который ничего не делает, причем первый жалуется tty, затем выдает ошибку, а второй просто ничего не делает и отключает собственный обработчик CTRL+ Node C, поэтому он даже не выходит из узла, когда я нажми. Как я могу успешно обрабатывать Ctrl+ Cв Windows ?

user3025492
источник

Ответы:

168

Если вы пытаетесь поймать сигнал прерывания SIGINT, вам не нужно читать с клавиатуры. processОбъект nodejsразоблачений прерывания событий:

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

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

Изменить : не работает в Windows без обходного пути. Глянь сюда

слезица
источник
3
За исключением того, что это не так. По крайней мере, не на окнах.
user3025492
1
Похоже, это уже исправлено ... в 2012 году. Github.com/joyent/node/issues/1553
Мейсон Ван
11
Для будущих читателей ответ на этот вопрос для Windows можно
найти
6

Для тех, кому нужен функционал, я нашел смерть (npm nodule, ха!) .

Автор также утверждает, что он работает с окнами:

Он был протестирован только на POSIX-совместимых системах. Вот хорошее обсуждение сигналов Windows, по-видимому, это было исправлено / отображено.

Могу подтвердить CTRL+ Cработает на win32 (да, удивлен).

Honzajde
источник