Mendeteksi CTRL + C di Node.js

92

Saya mendapatkan kode ini dari pertanyaan SO yang berbeda, tetapi node mengeluh untuk menggunakan process.stdin.setRawMode daripada tty, jadi saya mengubahnya.

Sebelum:

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);

Setelah:

process.stdin.setRawMode(true);
process.stdin.on("keypress", function(chunk, key) {
  if(key && key.name === "c" && key.ctrl) {
    console.log("bye bye");
    process.exit();
  }
});

Bagaimanapun, itu hanya membuat proses node yang benar-benar tidak responsif yang tidak melakukan apa-apa, dengan yang pertama mengeluh tentang tty, kemudian membuat kesalahan, dan yang kedua hanya tidak melakukan apa-apa dan menonaktifkan penangan asli CTRL+ Node C, jadi itu bahkan tidak keluar dari node ketika saya tekan itu. Bagaimana saya bisa berhasil menangani Ctrl+ Cdi Windows ?

pengguna3025492
sumber

Jawaban:

176

Jika Anda mencoba menangkap sinyal interupsi SIGINT, Anda tidak perlu membaca dari keyboard. The processobyek nodejspaparan acara interupsi:

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

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

Edit : tidak berfungsi di Windows tanpa solusi. Lihat disini

slezica.dll
sumber
3
Kecuali itu tidak. Di laest bukan di jendela.
pengguna3025492
1
Tampaknya itu sudah diperbaiki ... pada tahun 2012. github.com/joyent/node/issues/1553
Mason Wan
11
Untuk pembaca selanjutnya, pertanyaan ini dijawab untuk windows di sini: stackoverflow.com/a/14861513/2020425
Griffork
Bekerja seperti sihir. Harus menjadi jawaban yang diterima. Terima kasih.
Atau Assayag
6

Bagi mereka yang membutuhkan fungsionalitas, saya menemukan kematian (npm nodule, hah!) .

Penulis juga mengklaim itu berfungsi di windows:

Ini hanya diuji pada sistem yang kompatibel dengan POSIX. Berikut adalah diskusi yang bagus tentang sinyal Windows, ternyata, ini telah diperbaiki / dipetakan.

Saya dapat mengonfirmasi CTRL+ Cberfungsi di win32 (ya, saya terkejut).

honzajde.dll
sumber