次のnode.jsコードを使用して、URLからドキュメントをダウンロードし、ディスクに保存しています。ドキュメントがダウンロードされたときに通知を受けたい。パイプを使用したコールバックを見たことがありません。または、ダウンロードの完了時にキャプチャできる「終了」イベントはありますか?
request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
次のnode.jsコードを使用して、URLからドキュメントをダウンロードし、ディスクに保存しています。ドキュメントがダウンロードされたときに通知を受けたい。パイプを使用したコールバックを見たことがありません。または、ダウンロードの完了時にキャプチャできる「終了」イベントはありますか?
request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
回答:
ストリームはEventEmittersなので、特定のイベントを聞くことができます。あなたが言ったようにfinish、リクエストのためのイベントがあります(以前はend)。
var stream = request(...).pipe(...);
stream.on('finish', function () { ... });
利用可能なイベントの詳細については、ストリームのドキュメントページを確認してください。
r.on('close'), function () {...})
ベースのnodejsドキュメント、http: //nodejs.org/api/stream.html#stream_event_finish 、それはwritableStreamのfinishイベントを処理する必要があります。
var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
Webからhttp(s)経由でファイルシステムにコンテンツをパイプするためのコードスニペット。@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 );
var r = request(...).on("end",function(){/* CALLBACK */}).pipe(...);