2017-04-02 10 views
1

스트림이 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을 사용하려고 시도했지만 구현이 어려워졌습니다.

답변

1

읽을 수있는 스트림은메서드를 사용합니다.이 메서드는 유닉스 파이프 연산자와 거의 비슷하지만 일부 유형의 문자열뿐만 아니라 js 객체도 스트리밍 할 수 있습니다.

Here's a link to the doc on pipe

귀하의 경우 사용의 예는 같은 수 : 당신은 아직도 그들이 전파하지 않는로 스트림 당 오류를 처리해야

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

주와 목적지가 아니다 읽을 수있는 오류가있는 경우 닫힙니다.

+0

감사합니다. 문서의 인용문 "여러 개의 쓰기 가능한 스트림을 단일 읽기 가능 스트림에 첨부 할 수 있습니다." 이거 야! 나는'pipe()'에 대해서 알았지 만,이 기능을 놓친 것처럼 보입니다. –