nodejs how to read keystrokes from stdin

前端 未结 6 1784
忘掉有多难
忘掉有多难 2020-11-28 01:37

Is it possible to listen for incoming keystrokes in a running nodejs script? If I use process.openStdin() and listen to its \'data\' event then the

相关标签:
6条回答
  • 2020-11-28 02:04

    In node >= 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)
    })
    

    See https://github.com/nodejs/node/issues/6626

    0 讨论(0)
  • 2020-11-28 02:05

    With nodejs 0.6.4 tested (Test failed in 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);
    

    if you run it and:

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

    Important code #1:

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

    Important code #2:

    .createInterface( process.stdin, {} );
    
    0 讨论(0)
  • 2020-11-28 02:07
    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...);
    }
    
    0 讨论(0)
  • 2020-11-28 02:10

    You can achieve it this way, if you switch to raw mode:

    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();
    });
    
    0 讨论(0)
  • 2020-11-28 02:14

    For those finding this answer since this capability was stripped from tty, here's how to get a raw character stream from 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 );
    });
    

    pretty simple - basically just like process.stdin's documentation but using setRawMode( true ) to get a raw stream, which is harder to identify in the documentation.

    0 讨论(0)
  • 2020-11-28 02:20

    This version uses the keypress module and supports node.js version 0.10, 0.8 and 0.6 as well as iojs 2.3. Be sure to run 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();
    
    0 讨论(0)
提交回复
热议问题