我使用以下node.js代码从某个URL下载文档并将其保存在磁盘中。 我想知道何时下载文档。我没有看到任何回调管道。或者,是否有任何'结束'事件可以在下载完成时捕获?
request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
答案 0 :(得分:278)
流是EventEmitter
,因此您可以收听某些事件。正如您所说,请求有finish
个事件(之前为end
)。
var stream = request(...).pipe(...);
stream.on('finish', function () { ... });
有关可用事件的详细信息,请查看stream documentation page。
答案 1 :(得分:37)
基于节点的js文档,http://nodejs.org/api/stream.html#stream_event_finish,
它应该处理可写的Stream finish
事件。
var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
答案 2 :(得分:6)
用于将内容从网络通过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);
});
答案 3 :(得分:1)
我发现了一个关于这个背景的问题的一个不同的解决方案。思想值得分享。
大部分示例都是从文件中创建readStreams
。但在我的情况下,readStream
必须从来自消息池的JSON
字符串创建。
var jsonStream = through2.obj(function(chunk, encoding, callback) {
this.push(JSON.stringify(chunk, null, 4) + '\n');
callback();
});
// message.vale --> valeu/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 );
答案 4 :(得分:-1)
这是一个处理请求中的错误并在写入文件后调用回调的解决方案:
request(opts)
.on('error', function(err){ return callback(err)})
.pipe(fs.createWriteStream(filename))
.on('finish', function (err) {
return callback(err);
});