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

时间:2014-10-20 07:19:21

标签: node.js stdin

我试图了解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();
          };
        };  
  });

};

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

2 个答案:

答案 0 :(得分:8)

您在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]);
}

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

答案 1 :(得分:1)

这通常是我在使用stdin(node.js)时输入的方式。这是ES5版本,我还没有使用ES6。

function processThis(input) {
  console.log(input);  //your code goes here
} 

process.stdin.resume();
process.stdin.setEncoding("ascii");
_input = "";
process.stdin.on("data", function (input) {
  _input += input;
});

process.stdin.on("end", function () {
   processThis(_input);
});

希望这会有所帮助。