스트림이 readable
인 것으로 가정합니다. request(URL)
. 그리고 디스크에 응답을 fs.createWriteStream()
및 요청과 함께 파이핑을 통해 쓰고 싶습니다. 그러나 동시에 나는 crypto.createHash()
스트림을 통해 다운로드 데이터의 체크섬을 계산하려고합니다.한 스트림에서 읽고 한 번에 여러 스트림에 쓰는 방법?
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()'에 대해서 알았지 만,이 기능을 놓친 것처럼 보입니다. –