Nodejs 如何触发stdin的end事件

Nodejs 如何触发stdin的end事件

Node文档Process中,关于stdin的代码如下:

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write('data: ' + chunk);
  }
});

process.stdin.on('end', function() {
  process.stdout.write('end');
});

我在windows环境下,运行效果如下:

图片

第一段输入abc正常输出abc,第二段什么都没输入,居然也输出了,难道不是null吗?

第三段输入ctrl+dctrl+z,都没有退出。

第四段输入ctrl+c,才退出,但是没有触发end事件。

请问这里的end事件如何触发??


5 回复

Node.js 如何触发 stdin 的 end 事件

在 Node.js 中,stdin 是一个可读流(Readable Stream),它允许我们从标准输入(通常是键盘)读取数据。根据官方文档,当 stdin 遇到文件结束符(EOF, End of File)时,会触发 end 事件。

在 Windows 环境下,通常使用 Ctrl+Z 来表示文件结束符(EOF)。然而,直接使用 Ctrl+Z 可能不会立即触发 end 事件,因为 Node.js 需要一些额外的处理来识别这个操作。

示例代码

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write('data: ' + chunk);
  }
});

process.stdin.on('end', function() {
  process.stdout.write('end\n');
});

解释

  1. 设置编码:

    process.stdin.setEncoding('utf8');
    

    这行代码将输入的数据编码设置为 UTF-8,以便更容易地处理文本。

  2. 监听 readable 事件:

    process.stdin.on('readable', function() {
      var chunk = process.stdin.read();
      if (chunk !== null) {
        process.stdout.write('data: ' + chunk);
      }
    });
    

    stdin 可以读取数据时,会触发 readable 事件。在这个回调函数中,我们调用 read() 方法来读取数据,并将其输出到标准输出。

  3. 监听 end 事件:

    process.stdin.on('end', function() {
      process.stdout.write('end\n');
    });
    

    stdin 遇到文件结束符时,会触发 end 事件。这通常发生在用户输入 Ctrl+D(在 Unix 系统上)或 Ctrl+Z(在 Windows 系统上)之后,并且随后按下了回车键。

触发 end 事件的方法

在 Windows 环境下,要触发 end 事件,你需要:

  1. 输入一些数据。
  2. 按下 Ctrl+Z
  3. 按下回车键。

这样,stdin 将会正确地识别文件结束符,并触发 end 事件。

总结

通过上述方法,你可以确保在 Node.js 中正确地触发 stdinend 事件。这在处理命令行输入时非常有用,特别是在需要处理文件结束符的情况下。


在readable事件处理中,检测输入结果是否满足结束条件,如是否输入回车,当满足输入结束条件时,使用process.stdin.emit(’end‘)手动触发end事件。

Ctrl-Z要回车后才好使吧,不回车不行

如果你什么字符都没有输入,但是你最后肯定回车了,系统会读入你输入的回车符,并把它作为一个输入,所以你的Null 判断条件要改一下。

在Node.js中,process.stdinend事件会在标准输入流结束时被触发。对于终端环境,通常需要发送特定的终止信号来结束输入流。在Unix系统(如Linux和macOS)中,可以通过发送Ctrl+D来触发end事件。而在Windows系统中,需要发送Ctrl+Z后按回车键。

根据你的描述,在Windows环境下,你需要发送Ctrl+Z然后按回车键来触发end事件。Ctrl+C会中断程序执行,而不是结束输入流。

以下是修改后的代码示例:

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write('data: ' + chunk);
  }
});

process.stdin.on('end', function() {
  process.stdout.write('\nend\n');
});

示例操作步骤

  1. 运行脚本。
  2. 输入一些文本,例如abc,然后回车。
  3. 按下Ctrl+Z键,然后回车。

这样就会触发end事件,并打印end信息。

注意事项

  • 在Unix系统中,可以直接使用Ctrl+D来触发end事件。
  • 在Windows系统中,需要先按下Ctrl+Z,然后回车键来结束输入流。
  • Ctrl+C会中断程序执行,而不是结束输入流。
回到顶部