此问题已在此处有答案:
How to implement a writable stream(3个答案)
上个月关门了。
我最近一直在nodejs下使用express和mongoose,我发现我能够做一些似乎不像我预期的那样工作的事情。当我在mongoose中生成一个聚合查询时,我得到了一个Aggregate
对象(例如,const aggregation = Foo.aggregate(pipeline).cursor()
。通过执行这个对象(aggregation.exec()
),我得到了一个AggregationCursor
,mongoose文档明确指出它继承自Readable
,因此是一个可读的流,可以通过管道传输到一个可写的流。
这就是我困惑的开始。我有一个express Response
对象res
,它继承自nodejs http.ServerResponse
,本身继承自http.OutgoingMessage
,没有一个继承Writable
。但是,aggregation.exec().pipe(res)
行可以正常工作,将聚合查询结果通过管道传输到响应对象。这是如何运作的?我看到http.ServerResponse
类有一个write
方法,但这就足够了吗?实现write
并发出适当的事件,即使没有任何继承,也能将对象视为Writable
吗?
我觉得这与JavaScript是一种原型语言的事实有关,所以没有什么真正的“继承”它只是查找原型链来查找属性,但我不确定。有人知道这是怎么回事吗?
1条答案
按热度按时间bqf10yzr1#
在Node.js中,当一个对象实现了Node.js核心
stream
模块提供的Writable
接口时,它被认为是一个可写流。要使对象成为可写流,您需要确保它遵循此接口,该接口由特定方法和事件处理组成。以下是所需内容的基本概述:
***实现可复制流接口:**您的对象应实现以下方法和事件:
write(chunk, encoding, callback)
:当数据应该写入流时调用此方法。它应该处理提供的chunk
,并在写操作完成时调用callback
。end([chunk[, encoding]][, callback])
:此方法用于表示写入结束。您可以选择在结束之前提供最终的chunk
和encoding
,并在流完全结束时调用callback
。on('finish', callback)
:这个事件在流完成写入时发出。您可以将自定义逻辑附加到finish
事件。***Handle Errors:**可写流也应该优雅地处理错误,在写入过程中发生错误时发出
'error'
事件。您可以使用emit
方法发出带有错误对象的此事件。通过实现这些方法并处理错误,您的自定义对象可以在Node.js中表现为可写流,允许您以类似流的方式向其写入数据。