监听(自己的)process.stdout(在 Node.js 中)

Rem*_*ror 6 io stdout stream node.js

对于熟悉该主题的人来说,这可能是一个基本问题。考虑以下玩具程序:

  const fs = require('fs');
  process.stdout.on('data', (chunk) => {
    fs.writeFileSync('myfile.txt', chunk, 'utf-8'); // just an example
  });
  process.stdout.write('xyz');
Run Code Online (Sandbox Code Playgroud)

如果我按原样运行此代码,则会收到以下错误:

  errno: -4053,
  code: 'ENOTCONN',
  syscall: 'read'
Run Code Online (Sandbox Code Playgroud)

我已经不明白为什么会发生这种情况。但事情变得更奇怪了:

console.log()当我运行前面带有 a 的代码时,不再抛出任何错误!但是,我为该事件定义的侦听器data在这种情况下似乎不会执行,因为没有创建文本文件。

有人可以向我解释为什么会发生这种情况以及我可以做什么来获得预期结果(此处写​​入 myfile.txt)?

Col*_*ons 3

您看到的第一个错误是由于尝试连接stdout以获取其data. 您尚未向 写入任何内容stdout,因此它尚未初始化,因此您无法连接到它!ENOTCONN确切的意思是:(Error: Not Connectedstdout套接字)。

现在,针对第二个错误。console.log()是 的别名process.stdout.write('\n')console.log()因此,当您运行前面带有 a 的代码时,您现在已经初始化了stdout,因此您可以连接到它并且不会ENOTCONN抛出任何错误。但是您正在等待来自控制台的输入stdout输入不是来自stdout; 它来自stdin

要解决此问题,您需要:

  1. 在连接stdin之前使用process.stdin.resume().
  2. 等待datafromstdin而不是stdout使用process.stdin.on(...).
  3. stdin当您完成从 接收输入后,使用 成功退出程序process.exit(0)
const fs = require('fs')

process.stdin.resume()
process.stdin.on('data', (chunk) => {
  fs.writeFileSync('mytestfile.txt', chunk, 'utf-8')

  // Uncomment the following line if you want to write
  // something to the console to indicate success
  // process.stdout.write("Got your input!")

  process.exit(0)
})
Run Code Online (Sandbox Code Playgroud)