Détection de CTRL + C dans Node.js


87

J'ai reçu ce code d'une autre question SO, mais node s'est plaint d'utiliser process.stdin.setRawMode au lieu de tty, alors je l'ai changé.

Avant:

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

Après:

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

Dans tous les cas, il s'agit simplement de créer un processus de nœud totalement insensible qui ne fait rien, le premier se plaignant tty, puis lançant une erreur, et le second ne faisant rien et désactivant le gestionnaire CTRL+ natif de Node C, donc il ne quitte même pas le nœud lorsque je Appuie. Comment puis-je gérer avec succès Ctrl+ Csous Windows ?

Réponses:


168

Si vous essayez d'attraper le signal d'interruption SIGINT, vous n'avez pas besoin de lire à partir du clavier. L' processobjet de nodejsexpose un événement d'interruption:

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

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

Edit : ne fonctionne pas sous Windows sans solution de contournement. Vois ici


3
Sauf que ce n'est pas le cas. Au moins pas sur les fenêtres.
user3025492

1
Il semble que ce soit déjà réglé ... en 2012. github.com/joyent/node/issues/1553
Mason Wan

11
Pour les futurs lecteurs, cette question est répondue pour Windows ici: stackoverflow.com/a/14861513/2020425
Griffork

6

Pour ceux qui ont besoin de la fonctionnalité, j'ai trouvé la mort (npm nodule, hah!) .

L'auteur affirme également que cela fonctionne sur Windows:

Il n'a été testé que sur les systèmes compatibles POSIX. Voici une belle discussion sur les signaux Windows, apparemment, cela a été corrigé / mappé.

Je peux confirmer CTRL+ Cfonctionne sur win32 (oui, je suis surpris).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.