Phát hiện CTRL + C trong Node.js


87

Tôi nhận được mã này từ một câu hỏi SO khác, nhưng nút phàn nàn sử dụng process.stdin.setRawMode thay vì tty, vì vậy tôi đã thay đổi nó.

Trước:

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

Sau:

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

Trong mọi trường hợp, nó chỉ tạo ra một quy trình nút hoàn toàn không phản hồi mà không làm gì cả, với lần đầu tiên phàn nàn tty, sau đó là lỗi và lần thứ hai chỉ không làm gì và vô hiệu hóa trình xử lý CTRL+ gốc của Node C, vì vậy nó thậm chí không thoát khỏi nút khi tôi nhấn nó. Làm cách nào để xử lý thành công Ctrl+ Ctrong Windows ?

Câu trả lời:


168

Nếu bạn đang cố gắng bắt tín hiệu ngắt SIGINT, bạn không cần phải đọc từ bàn phím. Đối processtượng nodejsphơi bày sự kiện gián đoạn:

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

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

Chỉnh sửa : không hoạt động trên Windows mà không có giải pháp thay thế. Xem tại đây


3
Ngoại trừ việc nó không. Ít nhất là không trên cửa sổ.
user3025492

1
Dường như nó đã được cố định ... vào năm 2012. github.com/joyent/node/issues/1553
Mason Wan

11
Đối với độc giả trong tương lai, câu hỏi này được trả lời cho các cửa sổ tại đây: stackoverflow.com/a/14861513/2020425
Griffork

6

Đối với những người cần chức năng, tôi đã tìm thấy cái chết (nốt sần npm, hah!) .

Tác giả cũng tuyên bố nó hoạt động trên windows:

Nó chỉ được thử nghiệm trên các hệ thống tương thích với POSIX. Đây là một cuộc thảo luận thú vị về các tín hiệu Windows, rõ ràng là điều này đã được sửa chữa / ánh xạ.

Tôi có thể xác nhận CTRL+ Choạt động trên win32 (vâng, tôi rất ngạc nhiên).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.