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