2013-07-11 16 views
5

node.js ve istek modülü ile bir downloader yazıyorum. Ben geri arama, dosya indirmek kaydedin ve aramaya Node.js dosyası indirilme isteği bazen boş veya yüklüdür

var r = request(url).pipe(fs.createWriteStream(targetPath)); 
r.on('error', function(err) { console.log(err); }); 
r.on('finish', cb); 

yapıyorum akışı sözdizimini kullanma. Ancak, vakaların neredeyse% 50'sinde dosya ya boş ya da hiç oluşturulmamış. error olay yayımlandı. Dosya henüz (tamamen) yazılmamış olsa bile finish olayının tetiklenmesi gibi görünüyor.

Bağlam: Her şey async.each çağrılarına sarılır.

Herhangi bir ipucu? Teşekkürler!

+0

deneyin hata ayıklama ve her zaman veri almadığınızı görmek ama sadece diske yapmıyor. –

cevap

9

Bunu erişmeden önce dosyayı kapatmak gerekir: (a 404 bulunamadı gibi)

var file = fs.createWriteStream(targetPath); 
var r = request(url).pipe(file); 
r.on('error', function(err) { console.log(err); }); 
r.on('finish', function() { file.close(cb) }); 

arada, url herhangi http hatası ile cevaplarsa, işte hatası 'olayı tetiklemez , muhtemelen ayrı kontrol etmelisiniz böylece: aynı zamanda bir `.sistem ('data'` dinleyici ekleyerek

function handleFailure(err) { console.log(err); }; 

var file = fs.createWriteStream(targetPath); 
request(url, function(error, response) { 
    if (response.statusCode != 200) { 
     console.log("oops, got a " + response.statusCode); 
     return 
    } 
    // close is async, and you have to wait until close completes otherwise 
    // you'll (very rarely) not be able to access the file in the callback. 
    file.on('finish', function() { file.close(cb) }); 

    response.pipe(file).on('error', handleFailure) 
    file.on('error', handleFailure) 
}).on('error', handleFailure);