如何处理node.js中的结束信号可写stream?

使用node.js 0.10的stream.Writable基类,如何处理消费者调用.end() ,从而发出信号,不再有数据可用?

在文档中唯一被告知在Writable子类中实现的方法是_write ,但是我找不到任何干净的方式来注意input已经耗尽。

我find的答案是听finish事件。

end()方法被调用,并且所有的数据已经被刷新到底层系统时,这个事件就会被发出。

我还没有testing过,但是我正在阅读的方式,所有对_write调用必须在finish事件发出之前finish

令人尴尬的是,从0.10开始,节点的stream.Writable不支持这个标准的,干净的方式。 这个问题已经在这里讨论: https : //github.com/joyent/node/issues/7348

在该页面中提出了几种解决方法。 TomFrost的可擦写模块暂时看起来是一个可接受的解决scheme。

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

考虑你问什么

我怎么能处理一个消费者调用.end()的情况,从而发出信号,没有更多的数据可用?

,你应该检查你的input(一个可读的stream)何时结束,而不是你的输出(你的可写stream)。 因此,在这种情况下,您可以检查可读stream上的end事件,如:

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

如果您不想自己pipe理stream程,您甚至可以将可读stream传送到可写入stream:

 readableStream.pipe(writableStream);