2012-07-12 69 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); 
    });