2013-07-11 6 views
5

मैं node.js और अनुरोध मॉड्यूल के साथ एक डाउनलोडर लिख रहा हूं। स्ट्रीम सिंटैक्स का उपयोग करके मैंNode.js अनुरोध फ़ाइल कभी-कभी खाली या कोई मौजूदा

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

फ़ाइल डाउनलोड करने, इसे सहेजने और कॉलबैक कॉल करने के लिए कर रहा हूं। हालांकि, लगभग 50% मामलों में फ़ाइल या तो खाली है या बिल्कुल नहीं बनाई गई है। नहीं error घटना उत्सर्जित है। ऐसा लगता है कि finish ईवेंट ट्रिगर किया गया है भले ही फ़ाइल अभी तक पूरी तरह लिखी नहीं गई थी।

संदर्भ: पूरी बात async.each कॉल में लिपटे है।

कोई सुराग? धन्यवाद!

+0

कोशिश डिबगिंग और यदि आप हमेशा डेटा प्राप्त हो रहा देख, लेकिन यह सिर्फ डिस्क के लिए यह नहीं कर रहा है। –

उत्तर

9

आप इसे एक्सेस करने से पहले फ़ाइल को बंद करने की जरूरत है: संयोग से

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) }); 

, अगर यूआरएल किसी भी http त्रुटि के साथ उत्तर (जैसे एक 404 नहीं मिला), कि 'त्रुटि' घटना को ट्रिगर नहीं करेगा है, तो आप शायद उस की जाँच करनी चाहिए अलग से: यह भी एक `.on ('data'` श्रोता जोड़कर

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); 
संबंधित मुद्दे