Виявлення 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+ Cобробник Node , тому він навіть не виходить з node, коли натисніть. Як я можу успішно обробляти Ctrl+ Cв Windows ?

Відповіді:


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
Для читачів в майбутньому це питання відповідає на вікна тут: stackoverflow.com/a/14861513/2020425
Griffork

6

Для тих, кому потрібна функціональність, я знайшов смерть (npm nodule, ха-ха!) .

Автор також стверджує, що це працює на вікнах:

Він був протестований лише на системах, сумісних з POSIX. Ось приємна дискусія щодо сигналів Windows, мабуть, це виправлено / зіставлено.

Я можу підтвердити CTRL+ Cпрацює на win32 (так, я здивований).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.