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

но он просто слушает нажатие клавиши, и ничего не происходит. Программа не будет продолжена.

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

Ответы

Ответ 1

Работает на меня:

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

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

Ответ 2

В 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 вышел из программы, но любой другой ключ, чтобы продолжить нормальное выполнение, вы можете вместо этого заменить эту функцию нажатием этой функции:

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()
  }))
}

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Надеюсь это поможет.

Ответ 5

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

Этот ответ берется из vadzim из node.js: readSync из stdin?

Ответ 6

Для этого есть пакет: пресс-любой ключ

И вот пример:

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.

Ответ 7

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

60% времени, это работает каждый раз.

Ответ 8

Я на самом деле сделал пакет npm под названием paktc, который поможет вам в этом. Если вы установите пакет:

> npm install paktc

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

// your console application code here...

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