Node.js 如何与“合作”;“上的过程标准”;?

Node.js 如何与“合作”;“上的过程标准”;?,node.js,stdin,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

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

};

为什么我第二次键入数字时“i”为空?如何正确使用“process.stdin.on”?

您在
process.stdin
的每个输入字符后附加了一个
可读的
侦听器,这会导致对每个字符调用
process.stdin.read()
stream.Readable.read()
,它是的一个实例,如果输入缓冲区中没有数据,则返回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',…)

附加一个一次性侦听器。这是使用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);
});

希望这有帮助。

您试过了吗?谢谢。但是还有两个问题-如果我运行它并且不按任何键,为什么会出现未定义的?如果我将rawMode设置为false——它不工作,为什么?当可以从流中读取数据时,会发出一个
可读
事件。因此,您必须在调用
read()
时检查
null
。默认情况下,
stdin
处于烹调模式,这意味着字符在回车后被缓冲并发送到程序。要使程序在非原始模式(烹饪)下工作,您可以在键入字符以刷新缓冲区后发送EOF(Ctrl+D),或按ENTER键并从输入中删除新行。如何以编程方式或交互方式调用process.stdin.on(“end”,)函数。我无法结束使用节点jsv.6.XHi,如何触发process.stdin.on('end')?我被困在控制台中,无法继续运行其余代码。您好,Control+D将触发进程。stdin.on('end')函数。