如何使用"process.stdin.on"?

iva*_*esi 8 stdin node.js

我想了解process.stdin.

例如 - 我需要在控制台中显示数组元素.我应该允许用户选择将显示哪个元素.

我有代码:

var arr = ['elem1','elem2','elem3','elem4','elem5'],
    lastIndx = arr.length-1;

showArrElem();

function showArrElem () {

  console.log('press number from 0 to ' + lastIndx +', or "q" to quit');

  process.stdin.on('readable', function (key) {
        var key = process.stdin.read();
        if (!process.stdin.isRaw) {
          process.stdin.setRawMode( true );
        } else {
          var i = String(key);
          if (i == 'q') {
            process.exit(0);
          } else {
            console.log('you press ' +i); // null
            console.log('e: ' +arr[i]);
            showArrElem();
          };
        };  
  });

};
Run Code Online (Sandbox Code Playgroud)

当我第二次输入数字时,为什么"i"为空?如何正确使用"process.stdin.on"?

c.P*_*.u1 9

你在每个输入字符后附加一个readable监听process.stdin器,这导致process.stdin.read()每个字符被调用多次.stream.Readable.read(),process.stdin如果输入缓冲区中没有数据,则返回null.要解决此问题,请将侦听器附加一次.

process.stdin.setRawMode(true);
process.stdin.on('readable', function () {
  var key = String(process.stdin.read());
  showArrEl(key);
});

function showArrEl (key) {
  console.log(arr[key]);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用附加一次性监听器process.stdin.once('readable', ...).