web-dev-qa-db-ja.com

nodejsで続行するには任意のキーを押してください

キーが押されるまでスクリプトの実行を一時停止する関数が必要です。私はもう試した:

var stdin = process.openStdin(); 
require('tty').setRawMode(true);    

stdin.on('keypress', function (chunk, key) {
  process.stdout.write('Get Chunk: ' + chunk + '\n');
  if (key && key.ctrl && key.name == 'c') process.exit();
});

しかし、それはただキープレスを聞いているだけで何も起こりません。プログラムは実行を継続しません。

実行を一時停止するにはどうすればよいですか?

22
Barterio

私のために働く:

console.log('Press any key to exit');

process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', process.exit.bind(process, 0));
22
vkurchatkin

Node.js 7.6以降では、これを行うことができます。

const keypress = async () => {
  process.stdin.setRawMode(true)
  return new Promise(resolve => process.stdin.once('data', () => {
    process.stdin.setRawMode(false)
    resolve()
  }))
}

;(async () => {

  console.log('program started, press any key to continue')
  await keypress()
  console.log('program still running, press any key to continue')
  await keypress()
  console.log('bye')

})().then(process.exit)

または、CTRL-Cでプログラムを終了し、他のキーで通常の実行を続行したい場合は、代わりに上記の「keypress」関数をこの関数で置き換えることができます。

const keypress = async () => {
  process.stdin.setRawMode(true)
  return new Promise(resolve => process.stdin.once('data', data => {
    const byteArray = [...data]
    if (byteArray.length > 0 && byteArray[0] === 3) {
      console.log('^C')
      process.exit(1)
    }
    process.stdin.setRawMode(false)
    resolve()
  }))
}
17
molsson

このスニペットは、プロセスを終了したくない場合に機能します。

console.log('Press any key to continue.');
process.stdin.once('data', function () {
  continueDoingStuff();
});

これは非同期なので、ループ内ではそのままでは機能しません-Node 7を使用している場合は、promiseでラップしてasync/await

8
NeonPaul

承認されたソリューションは、キーイベントを非同期的に待機してから終了します。これは、「続行するには任意のキーを押す」ためのソリューションではありません。

Nodejsシェルスクリプトの作成中に一時停止する必要がありました。シェルコマンド「read」でchild_processのspawnSyncを使用してしまいました。

これは基本的にスクリプトを一時停止し、Enterキーを押すと続行します。 Windowsのpauseコマンドとよく似ています。

require('child_process').spawnSync("read _ ", {Shell: true, stdio: [0, 1, 2]});

お役に立てれば。

6
Ralph
var fs = require("fs")
var fd = fs.openSync("/dev/stdin", "rs")
fs.readSync(fd, new Buffer(1), 0, 1)
fs.closeSync(fd)

この答えは node.js:readSync from stdin? からvadzimから取得されます

2
Wong Jia Hau

これのためのパッケージがあります: press-any-key

そしてここに例があります:

const pressAnyKey = require('press-any-key');
pressAnyKey("Press any key to resolve, or CTRL+C to reject", {
  ctrlC: "reject"
})
  .then(() => {
    console.log('You pressed any key')
  })
  .catch(() => {
    console.log('You pressed CTRL+C')
  })

W10では問題なく動作します。

2
Josem
const fs = require('fs');
process.stdin.setRawMode(true);
fs.readSync(0, Buffer.alloc(1), 0, 1);

時間の60%、それは毎回動作します。

1
matpop