Node.js 了解节点中的流返回的内容

Node.js 了解节点中的流返回的内容,node.js,stream,Node.js,Stream,我正在做一个使用流的项目。实际上,我正在将ObjectMode中的一个可读对象流传输到一个转换流,转换流将其字符串化并将其转换为一个对象,然后将其发送到web框架的reply()方法 一切正常,但我很难准确地理解到底发生了什么。以下是工作示例: var foo = new FooModel(); var stream = foo.all(); reply(stream.pipe(ObjectTransform)); 在这里,我调用一个模型,该模型返回一个在对象模式下可读的流。然后,我将其输送

我正在做一个使用流的项目。实际上,我正在将ObjectMode中的一个可读对象流传输到一个转换流,转换流将其字符串化并将其转换为一个对象,然后将其发送到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);
有人能帮我把它分解一下,让我更好地理解它吗?

返回目标流。此模式允许链接
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)
。通过这种方式,您可以在代码示例中使用一行代码:
newfoomodel().all().pipe(ObjectTransform).pipe(reply)

显然,这只适用于
reply
是一个可写流的情况:在您的例子中,它是一个函数,我猜它是通过内部管道将其参数传输到另一个流的,因此前面的段落不适用于此

有关流的更多信息,请阅读