繁体   English   中英

如何在 Node.js 中一次将一个可读流传输到两个可写流中?

[英]How to pipe one readable stream into two writable streams at once in Node.js?

目标是:

  1. 创建文件读取流。
  2. 通过管道将其传送到 gzip ( zlib.createGzip() )
  3. 然后将 zlib 输出的读取流通过管道传输到:

    1) HTTP response对象

    2)可写文件流来保存 gzip 输出。

现在我可以做到 3.1:

var gzip = zlib.createGzip(),
    sourceFileStream = fs.createReadStream(sourceFilePath),
    targetFileStream = fs.createWriteStream(targetFilePath);

response.setHeader('Content-Encoding', 'gzip');

sourceFileStream.pipe(gzip).pipe(response);

...这工作正常,但我还需要将 gzipped 数据保存到一个文件中,这样我就不需要每次都 regzip 并且能够直接将 gzipped 数据作为响应流式传输。

那么如何在 Node 中一次将一个可读流传输到两个可写流中呢?

sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream); 在 Node 0.8.x 中工作?

管道链接/拆分不像你在这里尝试做的那样工作,发送第一个到两个不同的后续步骤:

sourceFileStream.pipe(gzip).pipe(response);

但是,您可以将相同的可读流通过管道传输到两个可写流中,例如:

var fs = require('fs');

var source = fs.createReadStream('source.txt');
var dest1 = fs.createWriteStream('dest1.txt');
var dest2 = fs.createWriteStream('dest2.txt');

source.pipe(dest1);
source.pipe(dest2);

我发现 zlib 返回一个可读流,该流稍后可以通过管道传输到多个其他流中。 所以我做了以下事情来解决上述问题:

var sourceFileStream = fs.createReadStream(sourceFile);
// Even though we could chain like
// sourceFileStream.pipe(zlib.createGzip()).pipe(response);
// we need a stream with a gzipped data to pipe to two
// other streams.
var gzip = sourceFileStream.pipe(zlib.createGzip());

// This will pipe the gzipped data to response object
// and automatically close the response object.
gzip.pipe(response);

// Then I can pipe the gzipped data to a file.
gzip.pipe(fs.createWriteStream(targetFilePath));

您可以使用“可读流克隆”包

const fs = require("fs");
const ReadableStreamClone = require("readable-stream-clone");

const readStream = fs.createReadStream('text.txt');

const readStream1 = new ReadableStreamClone(readStream);
const readStream2 = new ReadableStreamClone(readStream);

const writeStream1 = fs.createWriteStream('sample1.txt');
const writeStream2 = fs.createWriteStream('sample2.txt');

readStream1.pipe(writeStream1)
readStream2.pipe(writeStream2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM