Подтвердить что ты не робот

Обнаружение 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?

4b9b3361

Ответ 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()
    }
})