การตรวจจับ CTRL + C ใน Node.js


92

ฉันได้รับรหัสนี้จากคำถาม 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จากนั้นจึงแสดงข้อผิดพลาดและครั้งที่สองเพียงแค่ไม่ทำอะไรเลยและปิดการใช้งาน Node CTRL+ Chandler ของ Node ดังนั้นจึงไม่ได้ออกจากโหนดเมื่อฉัน กดมัน ฉันจะจัดการCtrl+ CในWindows ให้สำเร็จได้อย่างไร

คำตอบ:


176

หากคุณกำลังพยายามจับสัญญาณขัดจังหวะSIGINTคุณไม่จำเป็นต้องอ่านจากแป้นพิมพ์ processวัตถุของnodejsexposes เหตุการณ์ขัดจังหวะ:

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

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

แก้ไข : ไม่ทำงานบน Windows โดยไม่มีวิธีแก้ปัญหา ดูที่นี่


3
ยกเว้นว่าจะไม่มี ที่ laest ไม่ได้อยู่บน windows
user3025492

1
ดูเหมือนว่าจะได้รับการแก้ไขแล้ว ... ในปี 2555 github.com/joyent/node/issues/1553
Mason Wan

11
สำหรับผู้อ่านในอนาคตคำถามนี้มีคำตอบสำหรับ windows ที่นี่: stackoverflow.com/a/14861513/2020425
Griffork

ทำงานได้เหมือนเวทมนตร์ ควรเป็นคำตอบที่ได้รับการยอมรับ ขอบคุณ.
หรือ Assayag

6

สำหรับผู้ที่ต้องการการทำงานที่ผมพบว่าการตาย (NPM โหนก, ฮะ!)

ผู้เขียนยังอ้างว่ามันใช้งานได้บน windows:

ได้รับการทดสอบบนระบบที่เข้ากันได้กับ POSIX เท่านั้น นี่เป็นการสนทนาที่ดีเกี่ยวกับสัญญาณ Windows ซึ่งเห็นได้ชัดว่าสิ่งนี้ได้รับการแก้ไข / แมปแล้ว

ฉันสามารถยืนยันCTRL+ Cทำงานบน win32 ได้ (ใช่ฉันแปลกใจ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.