web-dev-qa-db-fra.com

Détection de CTRL + C dans Node.js

J'ai obtenu ce code d'une autre question SO, mais le noeud s'est plaint d'utiliser process.stdin.setRawMode au lieu de tty, je l'ai donc 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 noeud totalement non-réactif qui ne fait rien. Le premier se plaint de tty, puis génère une erreur, le second ne fait rien et désactive le natif de Node. CTRL+C gestionnaire, de sorte qu'il ne quitte même pas le noeud lorsque j'appuie dessus. Comment puis-je gérer avec succès Ctrl+C dans Windows?

68
user3025492

Si vous essayez de capturer le signal d'interruption SIGINT, vous n'avez pas besoin de lire à partir du clavier. L'objet process de nodejs expose 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. voir ici

130
slezica

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

Auteur également revendications cela fonctionne sur windows:

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

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

5
honzajde