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 ?

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.