142 votes

nodejs comment lire les frappes à partir de stdin.

Est-il possible d'écouter pour la réception des frappes en cours d'exécution nodejs script? Si j'utilise process.openStdin() et d'écouter ses 'data' événement, l'entrée est mise en mémoire tampon jusqu'à ce que la prochaine ligne, comme ceci:

// stdin_test.js
var stdin = process.openStdin();
stdin.on('data', function(chunk) { console.log("Got chunk: " + chunk); });

L'exécution de cette, j'obtiens:

$ node stdin_test.js
                <-- type '1'
                <-- type '2'
                <-- hit enter
Got chunk: 12

Ce que j'aimerais c'est à voir:

$ node stdin_test.js
                <-- type '1' (without hitting enter yet)
 Got chunk: 1

Je suis à la recherche d'un nodejs équivalent, par exemple, getc en ruby

Est-ce possible?

174voto

Dan Heberden Points 6697

Pour ceux qui éprouvent cette réponse étant donné que cette fonctionnalité a été retirée tty, voici comment obtenir un raw de flux de caractères à partir de stdin:

var stdin = process.stdin;

// without this, we would only get streams once enter is pressed
stdin.setRawMode( true );

// resume stdin in the parent process (node app won't quit all by itself
// unless an error or process.exit() happens)
stdin.resume();

// i don't want binary, do you?
stdin.setEncoding( 'utf8' );

// on any data into stdin
stdin.on( 'data', function( key ){
  // ctrl-c ( end of text )
  if ( key === '\u0003' ) {
    process.exit();
  }
  // write the key to stdout all normal like
  process.stdout.write( key );
});

assez simple - essentiellement comme processus.stdin de la documentation , mais en utilisant setRawMode( true ) d'obtenir un flux raw, ce qui est difficile à identifier dans la documentation.

66voto

DanS Points 4992

Vous pouvez l'atteindre de cette façon, si vous passez en mode raw:

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

29voto

Peter Lyons Points 47794

Cette version utilise la touche du module et prend en charge node.js la version 0.10, 0.8 et 0.6. Assurez-vous d'exécuter npm install --save keypress.

var keypress = require('keypress')
  , tty = require('tty');

// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);

// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress"', key);
  if (key && key.ctrl && key.name == 'c') {
    process.stdin.pause();
  }
});

if (typeof process.stdin.setRawMode == 'function') {
  process.stdin.setRawMode(true);
} else {
  tty.setRawMode(true);
}
process.stdin.resume();

9voto

befzz Points 107

Avec nodejs 0.6.4 testé (Test a échoué dans la version 0.8.14):

rint = require('readline').createInterface( process.stdin, {} ); 
rint.input.on('keypress',function( char, key) {
    //console.log(key);
    if( key == undefined ) {
        process.stdout.write('{'+char+'}')
    } else {
        if( key.name == 'escape' ) {
            process.exit();
        }
        process.stdout.write('['+key.name+']');
    }

}); 
require('tty').setRawMode(true);
setTimeout(process.exit, 10000);

si vous l'exécutez, et:

  <--type '1'
{1}
  <--type 'a'
{1}[a]

Important le code n ° 1:

require('tty').setRawMode( true );

Important le code n ° 2:

.createInterface( process.stdin, {} );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X