如何在Node.js可写流中处理结束信号?

5
使用 node.js 0.10 的 stream.Writable 基类时,如何处理消费者调用.end()并因此发出不再有数据可用的信号的情况?
文档 中,唯一要求在Writable子类中实现的方法是_write,但我找不到任何干净的方法来注意到输入已经用尽。
5个回答

3
我找到的答案是监听finish事件。

当调用end()方法并且所有数据都被刷新到底层系统时,触发此事件。

我还没有测试过,但按照我的理解,所有对_write的调用必须在发出finish事件之前完成。

可写流 API 是否已更改,因为现在文档建议实现 _write()_writev()_final() - uzluisf

3

我知道这很旧了,但我在2020年遇到了这个问题。如果其他人也来到这里:现在已经在Writable._final()中实现了,文档在这里


1
我无法编辑它:there -> their。 - uzluisf

0

令人尴尬的是,截至0.10版本,node的stream.Writable没有以标准、干净的方式支持这一点。此问题已在https://github.com/joyent/node/issues/7348上进行讨论。

该页面提出了几种解决方法。TomFrost的flushwritable模块看起来是目前可以接受的解决方案。

该模块提供了一个FlushWritable类,该类的使用方式与stream.Writable完全相同,但支持一个新的_flush方法,在消费者调用.end()但在finish事件被触发之前被调用。


0
从nodejs可写流的源代码中。 调用end将触发finish事件,如果流能够结束。 如果流没有_final函数,则还会触发prefinish事件。

-1

考虑到你的问题:

当消费者调用.end()并因此发出不再有数据可用的信号时,我该如何处理?

你应该检查输入流(可读流)何时结束,而不是输出流(可写流)。所以,在这种情况下,你可以检查可读流上的end事件,例如:

readableStream.on('end', function () {
  // do what you want with your writable stream, maybe call the end() method
  writableStream.end();
});

你甚至可以将可读流传输到可写流中,如果你不想自己管理数据流的话。
readableStream.pipe(writableStream);

我正在实现一个可写流。其他流会使用.pipe().write()将数据写入我的流中。在某个时间点,输入将被完全刷新,我的流将收到.end()调用(直接或作为.pipe()行为的一部分)。我希望我的可写流能够检测到这一点,并关闭它正在写入的文件等操作。 - Alicia
好的,明白了。所以,在这种情况下,一个选项是在您的可写流中实现一个方法,该方法接收输入流作为参数并检查其是否已结束,然后关闭文件。 - Rodrigo Medeiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接