nodejs, как читать нажатия клавиш от stdin

Можно ли прослушивать входящие нажатия клавиш в сценарии running nodejs? Если я использую process.openStdin() и слушаю его 'data' тогда вход буферизуется до следующей новой строки, например:

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

Выполняя это, я получаю:

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

Я бы хотел увидеть:

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

Я ищу эквивалент nodejs, например, getc в ruby

Это возможно?

Вы можете добиться этого таким образом, если вы перейдете в режим 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(); }); 

Для тех, кто находит этот ответ, так как эта возможность была удалена из tty , вот как получить stream символов из 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 ); }); 

довольно просто – в основном так же, как документация process.stdin, но с помощью setRawMode( true ) для получения необработанного streamа, который сложнее идентифицировать в документации.

Эта версия использует модуль keypress и поддерживает node.js версии 0,10, 0,8 и 0,6, а также iojs 2.3. Обязательно запустите 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(); 

В последнем узле (v6.1.0):

 const readline = require('readline'); readline.emitKeypressEvents(process.stdin); process.stdin.setRawMode(true); process.stdin.on('keypress', (str, key) => { console.log(str) console.log(key) }) 

См. https://github.com/nodejs/node/issues/6626

При тестировании nodejs 0.6.4 ( тест не выполнен в версии 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); 

если вы запустите его и:

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

Важный код # 1:

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

Важный код # 2:

 .createInterface( process.stdin, {} ); 
 if(Boolean(process.stdout.isTTY)){ process.stdin.on("readable",function(){ var chunk = process.stdin.read(); if(chunk != null) doSomethingWithInput(chunk); }); process.stdin.setRawMode(true); } else { console.log("You are not using a tty device...); } 
  • Чтение Eclipse stdin (System.in) из файла
  • Предоставить пароль SU в сценарии bash, в скрипте?
  • Как отправить ввод на консоль, как если бы пользователь печатал?
  • Как читать из файла или stdin в Bash?
  • Почему мы не можем читать один символ за раз из System.in?
  • Обманите приложение, думая, что его выступление - это терминал, а не труба
  • Как читать из stdin с помощью fgets ()?
  • Очистить stdin перед чтением
  • Можно ли установить тайм-аут для std :: cin?
  • Обнаруживать, является ли stdin терминалом или трубой?
  • Почему я получаю «Необработанный тип исключения IOException»?
  • Давайте будем гением компьютера.