파이프 완성을 처리하기위한 콜백 대해 알려 드리고자합니다. 파이프로

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

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


답변

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

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

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


답변

http://nodejs.org/api/stream.html#stream_event_finish 기반 nodejs 문서 는 writableStream의 finish이벤트를 처리해야합니다 .

var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });

답변

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);
});

답변

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

대부분의 예제 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 );

답변

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

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });