파이프 완성을 처리하기위한 콜백


196

다음 node.js 코드를 사용하여 일부 URL에서 문서를 다운로드하여 디스크에 저장합니다. 문서 다운로드시기에 대해 알려 드리고자합니다. 파이프로 콜백을 보지 못했습니다. 또는 다운로드가 완료되면 캡처 할 수있는 '종료'이벤트가 있습니까?

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));

답변:


302

스트림은 EventEmitter이므로 특정 이벤트를들을 수 있습니다. 당신이 말한 것처럼 finish요청에 대한 이벤트가 있습니다 (이전 end).

 var stream = request(...).pipe(...);
 stream.on('finish', function () { ... });

사용 가능한 이벤트에 대한 자세한 내용은 스트림 설명서 페이지를 확인 하십시오 .


12
var r = request(...).on("end",function(){/* CALLBACK */}).pipe(...);
— 거부 거부 Vitali

6
나를 위해 이벤트 '종료'보다는 '닫기'행사r.on('close'), function () {...})
— 저드슨

9
'end'이벤트는 이제 'finish'파이프 이벤트입니다 : nodejs.org/api/stream.html#stream_event_finish
— Pier-Luc

13
'종료'이벤트는 여전히 존재하며 읽기 가능한 스트림에서 사용됩니다. 쓰기 가능한 스트림은 '완료'를 사용합니다. 이는 변환 스트림이 둘의 혼합이며 이벤트를 구별해야하기 때문입니다.
— noderman

16
이 스레드는 노드 스트림 작업 방식을 잘 요약 한 것입니다.
— pomber


9

http를 통해 웹에서 파일 시스템으로 컨텐츠를 파이프하기위한 코드 스 니펫. @starbeamrainbowlabs는 이벤트 finish가 작동하는 것으로 나타났습니다

var tmpFile = "/tmp/somefilename.doc";

var ws = fs.createWriteStream(tmpFile);
ws.on('finish', function() {
  // pipe done here, do something with file
});

var client = url.slice(0, 5) === 'https' ? https : http;
client.get(url, function(response) {
  return response.pipe(ws);
});

on 'finish'는 저에게 효과적이며 'end'는 아닙니다. 감사합니다!
— shaosh

1
하나의 특별한 경우에, 모든 예상 바이트가 도착하기 전에 finish가 시작되는 것 같습니다
— Michael

4

이 상황과 관련하여 내 문제에 대한 약간 다른 해결책을 찾았습니다. 공유할만한 가치가 있다고 생각했습니다.

대부분의 예제 readStreams는 파일에서 작성 합니다. 그러나 필자의 경우 메시지 풀에서 오는 문자열에서 readStream만들어야 JSON합니다.

var jsonStream = through2.obj(function(chunk, encoding, callback) {
                    this.push(JSON.stringify(chunk, null, 4) + '\n');
                    callback();
                });
// message.value --> value/text to write in write.txt 
jsonStream.write(JSON.parse(message.value));
var writeStream = sftp.createWriteStream("/path/to/write/write.txt");

//"close" event didn't work for me!
writeStream.on( 'close', function () {
    console.log( "- done!" );
    sftp.end();
    }
);

//"finish" event didn't work for me either!
writeStream.on( 'close', function () {
    console.log( "- done!"
        sftp.end();
        }
);

// finally this worked for me!
jsonStream.on('data', function(data) {
    var toString = Object.prototype.toString.call(data);
    console.log('type of data:', toString);
    console.log( "- file transferred" );
});

jsonStream.pipe( writeStream );

"finish"를 듣는 대신 "close"에 대한 두 개의 핸들러가 있습니다. 아마도 그 이유 일 것입니다. "마침"이벤트가 저에게 효과적입니다.
— jowo

3

다음은 요청에서 오류를 처리하고 파일이 작성된 후 콜백을 호출하는 솔루션입니다.

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.