web-dev-qa-db-ja.com

Node.jsでのCTRL + Cの検出

別のSOの質問からこのコードを取得しましたが、ノードがttyではなくprocess.stdin.setRawModeを使用すると文句を言ったので、変更しました。

前:

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について文句を言ってからエラーをスローし、2番目は何もせずにNodeのネイティブを無効にします CTRL+C ハンドラーなので、私がそれを押してもノードを終了しません。どうすればうまく処理できますか Ctrl+C in Windows

68
user3025492

割り込み信号SIGINTをキャッチしようとしている場合は、キーボードから読み取る必要はありません。 processnodejsオブジェクトは、割り込みイベントを公開します。

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

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

Edit:Windowsでは回避策なしでは機能しません。 こちらを参照

130
slezica

機能が必要な人のために、私は death(npm nodule、hah!) を見つけました。

作者もclaimsで動作します:

POSIX互換システムでのみテストされています。 Windowsシグナルに関する素晴らしい議論があります。明らかに、これは修正/マッピングされています。

確認できます CTRL+C win32で動作します(はい、驚いています)。

5
honzajde