如果 Readable.pipe() 返回一个 Writable,我们如何链接管道?

Tee*_*moh 5 node.js

Node.js文档称,readable.pipe(destination[, options]) “返回对目标流的引用,从而可以设置管道流链”。

Stream.Writable 的文档没有提到该方法pipe,因此该方法似乎不可用。

pipe但是,如果该方法在返回值上不可用,那么如何才能在返回值Writeable上调用该方法呢?

例子:

    |-> returns a Writable
    |
r.pipe(z).pipe(w);
            |
            |-> How is the chained pipe available here?
Run Code Online (Sandbox Code Playgroud)

是我没抓住重点还是文档没抓住重点?

Cha*_*tin 3

如果继续向下滚动同一页面,您将找到Duplex 和 Transform Streams的文档。和stream.Duplexstream.Transform实现stream.Readablestream.Writable接口。您可以使用它们来链接调用.pipe。事实上,它们的存在就是为了这个目的

一个常见的例子是读取、压缩和写入文件......

const gzip = zlib.createGzip();
const fs = require('fs');
const inp = fs.createReadStream('input.txt');
const out = fs.createWriteStream('input.txt.gz');

inp.pipe(gzip).pipe(out);
Run Code Online (Sandbox Code Playgroud)

在此示例中,zlib.createGzip()返回一个Transform流。您可以通过子类化来创建自己的自定义转换stream.Transform

  • 您引用的文档部分只是一个示例。下面的几行,它们显示了管道的另一个示例,并清楚地指出“ Readable.pipe() 方法返回对目标流的引用,从而可以设置管道流链”。我同意这个措辞有点棘手,但是“管道”返回的内容取决于您要通过管道传输的内容。不过,文档并没有错,因为 Duplex 或 Transform 流在技术上是可写流。它也是一个可读流 (2认同)
  • 换句话说,`.pipe` 返回的必须是一个 `Writable`。然而,它也可以是允许链接的“可读”和“可写”。如果他们没有要求它是“可写”,那么您将遇到无法写入管道结果而必须将其链接起来的情况,这不是很可组合的 (2认同)