web-dev-qa-db-ja.com

Node.jsで1つの読み取り可能なストリームを2つの書き込み可能なストリームに一度にパイプする方法は?

目標は次のとおりです。

  1. ファイル読み取りストリームを作成します。
  2. それをgzipにパイプします(zlib.createGzip()
  3. 次に、zlib出力の読み取りストリームをパイプします。

    1)HTTP responseオブジェクト

    2)and 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);
_

...正常に動作しますが、gzip圧縮されたデータをファイルに保存するも必要です。これにより、毎回regzipを実行して、gzip圧縮されたデータを応答として直接ストリーミングする必要がなくなります。

Nodeで1つの読み取り可能なストリームを2つの書き込み可能なストリームに一度にパイプするにはどうすればよいですか?

sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);はNode 0.8.xで動作しますか?

31
Eye

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));
11
Eye

ここでやろうとしているように、パイプチェーン/分割は機能せず、最初の2つの異なるステップに最初のステップを送信します。

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

ただし、次のように、同じ読み取り可能なストリームを2つの書き込み可能なストリームにパイプすることができます。

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);
48
hunterloftis