了解从Node中的流返回的内容

时间:2014-01-09 20:04:52

标签: node.js stream

我正在开发一个使用流的项目。我实际上是将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);

有人可以为我打破这个,所以我更了解它吗?

1 个答案:

答案 0 :(得分:0)

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)

Obvioulsy这只有在reply是可写流的情况下才有效:在你的情况下,它是一个函数,我猜在内部将其参数传递给另一个流,所以前一段不适用于那里。

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