2017-04-02 13 views
1

readableストリームがあるとします。 request(URL)。そして私はfs.createWriteStream()を介してその応答をディスクに書き込んで、要求に応じてパイプしたいと思っています。しかし、同時に私はcrypto.createHash()ストリームを介してダウンロードデータのチェックサムを計算したいと思います。1つのストリームから読み込み、一度に複数のストリームに書き込む方法はありますか?

readable -+-> calc checksum 
      | 
      +-> write to disk 

そして私は、応答全体をメモリにバッファリングすることなく、その場でやりたいと思います。

oldschool on('data')フックを使用して実装できるようです。以下の擬似コード:

const hashStream = crypto.createHash('sha256'); 
hashStream.on('error', cleanup); 

const dst = fs.createWriteStream('...'); 
dst.on('error', cleanup); 

request(...).on('data', (chunk) => { 
    hashStream.write(chunk); 
    dst.write(chunk); 
}).on('end',() => { 
    hashStream.end(); 
    const checksum = hashStream.read(); 
    if (checksum != '...') { 
     cleanup(); 
    } else { 
     dst.end(); 
    } 
}).on('error', cleanup); 

function cleanup() { /* cancel streams, erase file */ }; 

しかし、このようなアプローチは非常に厄介です。私はread | calc + echo | writeのようなものを実装するためにstream.Transformまたはstream.Writableを使用しようとしましたが、私は実装が残っています。

答えて

1

Node.jsの読み取り可能なストリームは、メソッドを持っています。ただし、jsオブジェクトとある種の文字列だけをストリームできるという点を除けば、unixパイプ演算子とよく似ています。

Here's a link to the doc on pipe

あなたのケースでの使用の例のようなものが考えられます。あなたはまだ、彼らが伝播していないとしてストリームあたりのエラーを処理する必要が

const req = request(...); 
req.pipe(dst); 
req.pipe(hash); 

注意をし、目的地ではありません読み取り可能なエラーが発生した場合は閉じます。

+0

ありがとうございます!ドキュメントからの引用 "複数の書き込み可能なストリームを単一の読み取り可能なストリームに添付することは可能です。"これだよ!私は 'pipe()'について知っていましたが、私はこの施設を見逃したようです。 –

関連する問題