нажмите любую клавишу, чтобы продолжить в 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();
});

но это просто прослушивание для нажатия и ничего не происходит. Программа не продолжает выполнение.

Как приостановить выполнение?

6 ответов


У меня работает:

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

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

этот фрагмент выполняет работу, если вы не хотите выходить из процесса:

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

это асинхронно, поэтому не будет работать внутри цикла как есть-если вы используете узел 7, Вы можете обернуть его в обещание и использовать async/await.


в узел.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()
  }))
}

принятое решение асинхронно ожидает ключевого события, а затем завершает работу, на самом деле это не решение "нажать любую клавишу для продолжения".

Мне нужно было сделать паузу при написании некоторых сценариев оболочки nodejs. Я закончил использование spawnSync child_process с командой оболочки "read".

это в основном приостановит скрипт, и когда вы нажмете Enter, он продолжит работу. Очень похоже на команду паузы в windows.

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

надеюсь, что это помогает.


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

этот ответ взят у Вадима из узел.js: readSync из stdin?


я фактически сделал пакет npm под названием paktc что поможет вам в этом. Если вы устанавливаете пакет:

> npm install paktc

тогда вы бы использовали его следующим образом:

// your console application code here...

require('paktc') // Press any key to continue...