node.js - process.stdout.write/process.stderr.write 猴子补丁适用于子进程,但不适用于父进程

标签 node.js fs node.js-stream nodejs-stream

所以我在 process.stdout.write/process.stderr.write

上有这个简单的猴子补丁
    const strm = fs.createWriteStream(logfile);
    const stdoutWrite = process.stdout.write;

    process.stdout.write = function () {
      strm.write.apply(strm,arguments);
      stdoutWrite.apply(process.stdout, arguments);
    };

(对于 process.stderr,它是相同的,并且正在写入相同的流)。

问题:

当我使用 node x.js 运行此过程时

流在关闭之前没有完成所有写入,甚至没有关闭。 但是如果我跑

$ node y.js  # this runs x.js in child process

现在,子进程中运行的流将完成写入,并且日志文件现已满。

为什么会这样?如果不使用 fs.appendFileSync,有没有办法确保流在进程关闭之前耗尽?

编辑:

我想我知道为什么会发生 - 我正在调用 process.exit() ,这将提前关闭进程,并且可能会在流完成之前被调用。

有没有办法监听流何时完成写入?如果当我调用 process.exit() 时在流上调用 finish() ,这似乎是人为的“完成”。我尝试等待“drain”事件,但它似乎永远不会触发。

最佳答案

writeend可以在操作完成时进行回调。

stream.end('end!', ()=> process.exit(0))

drain仅当您可以恢复写入先前失败/阻止的流时,事件才会触发。

我不完全确定失败时 end/write 回调的语义。您可能需要添加超时,当然,如果写入阻塞,回调将不会运行,直到数据刷新。

stream.end('end!', ()=> process.exit(0))
setTimeout(()=> {
  console.log('end timed out')
  process.exit(1)
}, 2000)

关于node.js - process.stdout.write/process.stderr.write 猴子补丁适用于子进程,但不适用于父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43506958/

相关文章:

javascript - 使用流写入和读取文件

javascript - 从下拉列表中选择选项并使用 nodejs 提交请求

node.js - multer访问req.body,无需上传文件

react-native - 错误 : ENOENT: no such file or directory, 打开 'fs.js

javascript - 故障排除错误 : connect ECONNREFUSED in nodejs stream-adventure tutorial

node.js - 如何测试流是否已结束?

javascript - 如果一个函数仅在另一个函数中使用,我应该将其保留在函数内部还是外部?

javascript - React Js - 如何保持 bundle.min.js 小?

node.js - child_process spawn nodejs 中的竞争条件可能性

javascript - 如何不覆盖node.js中的文件