2013-07-11 8 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

は、あなたがそれにアクセスする前に、ファイルをクローズする必要があります(404が見つからないなど)

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

をちなみに、URLは任意のHTTPエラーで応答した場合、それは「エラー」イベントをトリガしません。 、あなたはおそらく、別途ことを確認する必要がありますので。また `.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);