2012-07-12 71 views
143

我正在使用以下node.js代码从某个url下载文件并将其保存在磁盘中。 我想知道下载文档的时间。我还没有看到任何回调pipe.Or,是否有任何'结束'事件可以完成下载捕获?回调来处理管道的完成

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

回答

218

流是EventEmitter所以你可以听某些事件。正如你所说,有一个finish事件请求(以前的end)。

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

有关哪些事件可用的更多信息,您可以检查stream documentation page

+11

'变种R =请求(...)上(“结束”,函数( ){/ * CALLBACK * /})。pipe(...);' – 2013-08-31 21:43:17

+6

对我来说事件'close',而不是'end'works'r.on('close'),function(){... })' – Judson 2013-12-16 20:20:09

+8

'结束'事件现在'结束' 管道事件:http://nodejs.org/api/stream.html#stream_event_finish – 2014-04-16 14:44:58

28

基于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(){ ... }); 
+0

接受的答案对节点v0.12.7不适用,但您的解决方案确实如此。 – 2015-08-30 14:13:00

6

将内容从管道通过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); 
}); 
+0

'完成'对我有用,'结束'不适用。谢谢! – shaosh 2015-09-20 05:04:25

+0

在一个特定的情况下,完成似乎是在所有预期的字节到达之前触发 – Michael 2016-10-06 06:02:08

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); 
+0

而不是听完“完成”你有两个处理“关闭”,也许这就是原因。 “完成”事件适用于我。 – jowo 2017-05-24 15:37:42

0

下面是在处理请求的错误,并调用文件被写入后回调的解决方案:

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