我正在做一个使用流的项目。实际上,我正在将ObjectMode中的Readable流式传输到转换流,转换流将其字符串化并转换为对象,然后将其发送到我的web框架的reply()方法。
一切都很好,但我很难确切地理解发生了什么。以下是工作示例:
var foo = new FooModel();
var stream = foo.all();
reply(stream.pipe(ObjectTransform));
在这里,我将调用一个模型,该模型返回在对象模式下可读的流。然后,我将其管道传输到ObjectTransform类,该类实际上只是一个转换流,用于字符串化从流中管道传输的对象。
但这正是我难以理解的:
reply(stream.pipe(ObjectTransform));
stream.pipe(ObjectTransform)返回什么?我不明白为什么不返回ObjectTransform流,因为这就是进行字符串化的原因。
这对我来说更有逻辑意义,但显然,它不是这样工作的:
var foo = new FooModel();
var stream = foo.all();
var stringified_stream = stream.pipe(ObjectTransform);
stringified_stream.pipe(reply);
有人能帮我把它分解一下,让我更好地理解它吗?
src.pipe(dest)
返回目标流。此模式允许pipe()
调用被链接:
a.pipe(b).pipe(c).pipe(d)
// is equivalent to
a.pipe(b)
b.pipe(c)
c.pipe(d)
您的代码可以归结为:
var foo = new FooModel();
var stream = foo.all();
// reply(stream.pipe(ObjectTransform));
stream.pipe(ObjectTransform);
reply(ObjectTransform);
正如您在问题中所写的那样,回答请求的"节点方式"是将可读流管道传输到可写流,例如ObjectTransform.pipe(reply)
。通过这种方式,您可以使用一行代码示例:new FooModel().all().pipe(ObjectTransform).pipe(reply)
。
显然,只有当reply
是一个可写流时,这才有效:在您的情况下,它是一个函数,我想它会在内部将其参数管道传输到另一个流,所以上一段不适用于此。
有关流的更多信息,您可以阅读流手册。