2016-10-18 10 views
0

サーバー上のファイル名のリストを含むJSONファイルがあります。このリストをループして各ファイルをローカルに保存する必要があります。私はこれをある程度学んでいます。時々それは魅力のように動作し、他のものは動作せず、空のファイルで終わります。Node.js - http.getを使用してローカルに保存するJSONのファイルリスト

これはおそらく前のファイルがダウンロードされる前にダウンロードされていますが、次のファイルのダウンロードを開始するときにコールバックを取得するように書き直すのに苦労しています。私はクライアントサイドのコーディングに熟練しているわけではないので、実際にはこれを参考にしていただければ幸いです。

var filefolder = 'http://www.example.com/files/'; 
     var newdir = nw.App.dataPath; 
     $.each(jsonFiles, function(i, fn) { 
      //read and download to save locally 
      var filelink = filefolder + '/' + fn; 
      var newfile = fs.createWriteStream(newdir+'/files/' + '/' + fn); 
      var request = http.get(filelink, function(response) { 
       response.pipe(newfile); 
       console.log(fn); 
       newfile.on('finish', function() { 
        newfile.close(cb); 
       }); 
      }); 
     }); 
+0

は思えます。たぶん、 "http new.file ..."のコールバックの中に "var newfile = ..."を配置してみてください。次に、 "response.pipe ..."を "newfile.on( 'finish')のコールバックに移動してください。 – josephnvu

+0

paramsが動作する可能性があるので、' filelink、newfile、fn&cb'で 'http.get'を閉じる – Thaadikkaaran

+0

ありがとう@josephnvu、あなたの提案を試みたが、すべてのファイルが空ではなく、ほんのわずかです。 – LeeTee

答えて

1

あなたのダウンロードコードがeachループ内で、http.getが非同期であるので、あなたは閉鎖して、コールをラップする必要があります。あなたは非同期レースの問題を持っているよう

このような何か、

var filefolder = 'http://www.example.com/files/'; 
var newdir = nw.App.dataPath; 
$.each(jsonFiles, function(i, fn) { 
    //read and download to save locally 
    var filelink = filefolder + '/' + fn; 
    var newfile = fs.createWriteStream(newdir + '/files/' + '/' + fn); 
    (function(filelink, newfile, fn, cb) { 
     var request = http.get(filelink, function(response) { 
       response.pipe(newfile); 
       console.log(fn); 
       newfile.on('finish', function() { 
        newfile.close(cb); 
       }); 
      }); 
    })(filelink, newfile, fn, cb) 
}); 
+0

ご協力ありがとうございます。私はまだいくつかの空のファイルを残念ながら取得:( – LeeTee

関連する問題