Erkennen von STRG + C in Node.js.

86

Ich habe diesen Code von einer anderen SO-Frage erhalten, aber der Knoten hat sich beschwert, process.stdin.setRawMode anstelle von tty zu verwenden, also habe ich ihn geändert.

Vor:

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

Nach dem:

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

In jedem Fall wird nur ein völlig nicht reagierender Knotenprozess erstellt, der nichts tut, wobei der erste sich beschwert tty, dann einen Fehler auslöst und der zweite nur nichts tut und den nativen CTRL+ CHandler von Node deaktiviert , sodass er den Knoten nicht einmal beendet, wenn ich Drück es. Wie kann ich Ctrl+ Cin Windows erfolgreich behandeln ?

user3025492
quelle

Antworten:

166

Wenn Sie versuchen, das Interrupt-Signal abzufangen SIGINT, müssen Sie nicht von der Tastatur lesen. Das processObjekt nodejsmacht ein Interrupt-Ereignis verfügbar:

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

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

Bearbeiten : Funktioniert nicht unter Windows ohne Problemumgehung. Siehe hier

Slezica
quelle
3
Nur dass es nicht so ist. Zumindest nicht an Fenstern.
user3025492
1
Es scheint, dass es bereits behoben ist ... im Jahr 2012. github.com/joyent/node/issues/1553
Mason Wan
10
Für zukünftige Leser wird diese Frage für Windows hier beantwortet: stackoverflow.com/a/14861513/2020425
Griffork
6

Für diejenigen, die die Funktionalität benötigen, habe ich den Tod gefunden (npm nodule, hah!) .

Der Autor behauptet auch, dass es unter Windows funktioniert:

Es wurde nur auf POSIX-kompatiblen Systemen getestet. Hier ist eine nette Diskussion über Windows-Signale, anscheinend wurde dies behoben / zugeordnet.

Ich kann bestätigen CTRL+ Cfunktioniert auf win32 (ja, ich bin überrascht).

honzajde
quelle