2014-03-26 86 views
1

我一直在努力通過幾個others,也 this循環通過數組來從各種來源的http.get數據。我知道nodeJS是異步工作的,它允許將文件寫入空白或不完整的數據,但我似乎無法超越這一點。node.js遍歷數組寫入文件

問題:電話由,文件建立,但文件總是空

目標:遍歷數組從網站的數據在本地創建文件。這裏是我到目前爲止有:

var file_url = 'http://js.arcgis.com/3.8amd/js/esri/', 
    DOWNLOAD_DIR = './esri/', 
    esriAMD = [ '_coremap.js', 'arcgis/csv.js']; 

function readFile(callback) { 
    if (esriAMD.length > 0) { 
    var setFile = esriAMD.shift(), 
     file_name = url.parse(file_url).pathname.split('/').pop(), 
     trial = setFile.split('/').pop(), 
     file = fs.createWriteStream(DOWNLOAD_DIR + trial); 

    http.get(file_url + esriAMD, function(res) { 
     res.on('data', function(data) { 
     file.write(data); 
     console.log(setFile + ' has been written successfully'); 
     }); 
     res.on('end', function(){ 
     console.log(setFile + ' written, moving on'); 
     console.log(esriAMD.length); 
     readFile(callback); 
     }); 
     //readFile(callback); 
    }); 
    } else { 
    callback(); 
    } 
} 
readFile(function() { 
    console.log("reading finishes"); 
}); 

任何有識之士將真正幫助。

感謝,

+0

嘗試使用簡單的模塊,如'request'是你可以直接管的文件流中。 – Gntem

+1

您目前的解決方案遇到了哪些問題? – sgress454

+1

這個「http.get(file_url + esriAMD ...」應該是「http.get(file_url + file_name ...」,對吧?另外,我會在http.get()的回調中創建文件,而不是在你的情況下應該沒有問題,因爲你不會再調用readFile()直到res.on('end'),但是在邏輯上它會使它更有意義。 –

回答

0

解決方案:我將錯誤的變量傳入http.get

工作代碼:

var file_url = 'http://.....', 
DOWNLOAD_DIR = './location/'; 
esriAMD = ['one', 'two', 'three'..0; 

function readFile(callback) { 
if(esriAMD.length > 0) { 
    var setFile = esriAMD.shift(), 
    file_name = url.parse(setFile).pathname.split('/').pop(), 
    trial = setFile.split('/').pop(), 
     file = fs.createWriteStream(DOWNLOAD_DIR + trial); 

    http.get(file_url + setFile, function(res){ 
     res.on('error', function(err){ 
      console.log(err); 
     }); 
     res.on('data', function(data){ 
      file.write(data); 
      console.log(setFile + ' started'); 
     }); 
     res.on('end', function(){ 
      console.log(setFile + ' completed, moving on'); 
     }); 
    }); 
} else { 
    callback(); 
} 
} 
0
var esriAMD = [....]; 
... 
function readFile(callback) { 
    ... 
    http.get(file_url + esriAMD, function(res) { 
     ... 

連接字符串與陣列可以產生意外的結果。

要確保

  • 你知道什麼網址,你的程序正在訪問
  • 程序交易錯誤情況(其中fsck的是res.on('error', ...)?)