Nodejs kaip skaityti klavišus iš stdin

Ar galiu klausytis įeinančių klavišų paspaudus js scenarijaus mazgas? Jei naudoju process.openStdin() ir išklausysiu jo 'data' įvykį, įvestis yra buferinė iki kito naujos eilutės, pavyzdžiui:

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

Vykdydamas tai, gaunu:

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

Norėčiau pamatyti:

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

Aš ieško nodejs ekvivalento, pavyzdžiui, getc ruby

Ar tai įmanoma?

89
15 февр. nustatykite 15 sav . 2011-02-15 20:00 '11 20:00 val. 2011-02-15 20:00
@ 6 atsakymai

Tai galite pasiekti taip, jei persijungsite į neapdorotą režimą:

 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(); }); 
54
20 февр. Atsakymas duotas DanS 20 vasario mėn. 2011-02-20 23:42 '11 11:42 val. 2011-02-20 23:42

Tiems, kurie randa šį atsakymą, nes ši funkcija buvo pašalinta iš „ tty , čia rasite, kaip gauti pradinį simbolių srautą iš „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 ); }); 
border=0

gana paprasta - iš esmės, kaip ir process.stdin dokumentacija , bet naudojant setRawMode( true ) kad gautumėte neapdorotą temą, kurią dokumentuose sunkiau nustatyti.

95
20 сент. Atsakyti Dan Heberden 20 rugsėjis 2012-09-20 08:38 '12 8:38 am 2012-09-20 08:38

Ši versija naudoja klavišų paspaudimo modulį ir palaiko node.js versijas 0.10, 0.8 ir 0.6, taip pat iojs 2.3. Būtinai paleiskite „ 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(); 
24
23 авг. Atsakė Peter Lyons rugpjūčio 23 d 2012-08-23 23:45 '12, 11:45 PM 2012-08-23 23:45

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

Žr. Https://github.com/nodejs/node/issues/6626

18
08 мая '16 в 0:19 2016-05-08 00:19 atsakymas pateikiamas arve0 08 gegužės 16 d. 0:19 2016-05-08 00:19

Su nodejs 0.6.4 patvirtinimu ( nepavyko atlikti testo versijoje 0.8.14 ):

8
05 дек. atsakymas pateiktas 05 d. 2011-12-05 14:53 '11 prie 14:53 2011-12-05 14:53
 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...); } 
2
05 мая '15 в 17:45 2015-05-05 17:45 atsakymas pateikiamas Xenon 05 gegužės 15 d. 17:45 2015-05-05 17:45

Kiti klausimai apie žymes arba Užduoti klausimą