【问题标题】:Reuse the write stream without ending it and declaring new stream over and over again重用写入流而不结束它并一遍又一遍地声明新流
【发布时间】:2015-11-28 06:21:37
【问题描述】:

这个函数在另一个设置 wStream 写入流的函数中 到 wStream 成功运行一次的文件。

但是运行这个

fs.watch(fname, function watcher (evt, fname) {


        if (evt === 'change') {
            wStream.write("File " + fname + " changed\n");

        } else if (evt === 'rename') {
            wStream.write("File " + orig + " renamed\n");

        }

产生这个错误

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: write after end
    at writeAfterEnd (_stream_writable.js:167:12)
    at WriteStream.Writable.write (_stream_writable.js:214:5)

如何在不结束此流的情况下继续重复使用它?

更新 正如 cmets 部分所指出的,有一个进程显式结束此流。

我在它上面运行一个 child_process.spawn 方法

SomeSpawn.stdout.pipe( wStream ); 

它为什么以及如何负责关闭此流?我怎样才能阻止它明确关闭它? 类似{end:false}

【问题讨论】:

  • 您可能在可写流上直接或间接调用end()。您能否发布更多代码,例如您操作wStream 的部分?
  • @RodrigoMedeiros 很有趣。与 wStream 相关的另一件事是 SomeSpawn.stdout.pipe( wStream );这是一个 child_process.spawn 方法。那如何关闭 wStream?

标签: node.js stream child-process


【解决方案1】:

child_process.spawn 返回一个 ChildProcess 对象。这个过程有它自己的stdout,它是一个ReadableStream。 ReadableStream 在通过管道传输到可写流时,会在完成读取时在该可写流上调用end()

如果你不想让可读流最后自动关闭目标流,只需将选项{ end: false }传递给pipe,如:

SomeSpawn.stdout.pipe( wStream, { end: false } ); 

在这种情况下,您必须在以后的某个时间手动关闭它。

【讨论】:

  • 如何阻止它显式关闭它?
  • 在手动关闭的情况下,像 SomeSpawn.disconnect() 这样的 child.disconnect() 会起作用吗?
  • 由于代码是异步的,我不确定何时执行 child.disconnect() 以及在何处执行 try catch 并优雅地捕获错误
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多