Detectando CTRL + C em Node.js


87

Peguei esse código de uma pergunta diferente do SO, mas o node reclamou para usar process.stdin.setRawMode em vez de tty, então mudei.

Antes:

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

Depois de:

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

Em qualquer caso, ele está apenas criando um processo de nó totalmente sem resposta que não faz nada, com o primeiro reclamando tty, então lançando um erro, e o segundo simplesmente não fazendo nada e desabilitando o manipulador nativo CTRL+ do Node C, então ele nem mesmo sai do nó quando eu pressione-o. Como posso lidar com Ctrl+ Cno Windows ?

Respostas:


168

Se você está tentando captar o sinal de interrupção SIGINT, não precisa ler no teclado. O processobjeto de nodejsexpõe um evento de interrupção:

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

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

Editar : não funciona no Windows sem uma solução alternativa. Veja aqui


3
Exceto que isso não acontece. Pelo menos não nas janelas.
user3025492

1
Parece que já está consertado ... em 2012. github.com/joyent/node/issues/1553
Mason Wan

11
Para leitores futuros, esta pergunta é respondida para windows aqui: stackoverflow.com/a/14861513/2020425
Griffork

6

Para quem precisa da funcionalidade, encontrei a morte (npm nodule, hah!) .

O autor também afirma que funciona no Windows:

Ele só foi testado em sistemas compatíveis com POSIX. Aqui está uma boa discussão sobre os sinais do Windows, aparentemente, isso foi corrigido / mapeado.

Posso confirmar CTRL+ Cfunciona no win32 (sim, estou surpreso).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.