node.js循环遍历数组以写入文件

时间:2014-03-26 19:04:23

标签: arrays node.js loops http-get streamwriter

我已经通过一些others,也是 this循环数组来处理来自各种来源的http.get数据。我知道nodeJS是异步工作的,它允许将文件写成空的或者数据不完整,但我似乎无法超越这一点。

问题:调用已建立,文件已构建但文件始终为空

目标:遍历数组,从网站数据本地创建文件。以下是我目前所做的:

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

任何见解都会有所帮助。

感谢,

2 个答案:

答案 0 :(得分:0)

var esriAMD = [....];
...
function readFile(callback) {
    ...
    http.get(file_url + esriAMD, function(res) {
        ...

将字符串与数组连接可能会产生意外结果。

你想确保

  • 您知道您的程序正在访问哪些网址
  • 您的程序处理错误情况(fsck为res.on('error', ...)?)

答案 1 :(得分: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();
 }
}