web-dev-qa-db-fra.com

appuyez sur n'importe quelle touche pour continuer dans nodejs

J'ai besoin d'une fonction qui suspendra l'exécution du script jusqu'à ce qu'une touche soit enfoncée. J'ai essayé:

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

mais il suffit d'écouter pour une pression de touche et rien ne se passe. Le programme ne continue pas à s'exécuter.

Comment puis-je suspendre l'exécution?

18
Barterio

Travaille pour moi:

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

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

Dans node.js 7.6 et versions ultérieures, vous pouvez le faire:

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)

Ou si vous souhaitez que CTRL-C quitte le programme mais que vous souhaitiez que l'exécution normale continue avec une autre touche, vous pouvez remplacer la fonction "pression au clavier" ci-dessus par cette fonction:

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

Cet extrait fait le travail si vous ne voulez pas quitter le processus:

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

C'est asynchrone, donc cela ne fonctionnera pas dans la boucle tel quel. Si vous utilisez le nœud 7, vous pouvez l'envelopper dans une promesse et utiliser async/await.

4
NeonPaul

La solution acceptée attend de manière asynchrone un événement de clé, puis se ferme. Ce n'est pas vraiment une solution pour "Appuyez sur n'importe quelle touche pour continuer".

J'avais besoin de faire une pause pendant l'écriture de certains scripts Shell de nodejs. J'ai fini par utiliser spawnSync du processus_enfant avec la commande shell "read".

Cela met le script en pause et lorsque vous appuyez sur Entrée, il continue. Tout comme la commande pause dans Windows.

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

J'espère que cela t'aides.

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

Cette réponse provient de vadzim de node.js: readSync de stdin?

1
Wong Jia Hau

Il existe un paquet pour cela: pressez n'importe quelle touche

Et voici un exemple:

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

Il fonctionne sans problèmes dans W10.

0
Josem