【问题标题】:how to work with "process.stdin.on"?如何使用“process.stdin.on”?
【发布时间】:2023-12-23 19:52:01
【问题描述】:

我正在尝试理解 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”?

【问题讨论】:

标签: node.js stdin


【解决方案1】:

您在每个输入字符之后在process.stdin 上附加了一个readable 侦听器,这导致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', ...) 附加一次性侦听器。

【讨论】:

  • 谢谢。但是还有几个问题 - 如果我运行它并且什么都不按,为什么会出现未定义?如果我将 rawMode 设置为 false - 它不起作用,为什么?
  • 当可以从流中读取数据时,会发出 readable 事件。因此,您必须在对read() 的调用中检查null。默认情况下,stdin 处于熟化模式,这意味着字符被缓冲并在回车后发送到程序。要使您的程序在非原始模式(熟)下工作,您可以在键入字符后发送 EOF (Ctrl + D) 以刷新缓冲区或按 ENTER 并从输入中删除新行。
【解决方案2】:

这通常是我在使用 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);
});

希望这会有所帮助。

【讨论】:

  • 如何以编程方式或交互方式调用 process.stdin.on("end", ) 函数。我无法结束使用 node js v.6.X
  • 您好,process.stdin.on('end') 是如何触发的?我被困在控制台中,无法继续运行其余代码。
  • 大家好,Control + D 会触发 process.stdin.on('end') 函数。