【问题标题】:node.js loop through array to write filesnode.js 循环遍历数组写入文件
【发布时间】:2023-03-20 20:05:01
【问题描述】:

我一直在处理一些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");
});

任何见解都会有帮助。

谢谢,

【问题讨论】:

  • 尝试使用更简单的模块,例如request,如果您可以将文件直接通过管道传输到流。
  • 您当前的解决方案有哪些问题?
  • 这个“http.get(file_url + esriAMD...”应该是“http.get(file_url + file_name...”,对吗?另外,我会在回调中为http.get() 而不是在外面。这对你来说应该没关系,因为在 res.on('end') 之前你不会再次调用 readFile() 但从逻辑上讲,它在里面会更有意义。
  • @Phoenix 我尝试了 http.request 并收到“套接字挂断”错误,有什么想法吗?
  • @HectorCorrea 感谢您为我指明了正确的方向,我传入了错误的变量。我应该传入'setFile'

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


【解决方案1】:
var esriAMD = [....];
...
function readFile(callback) {
    ...
    http.get(file_url + esriAMD, function(res) {
        ...

将字符串与数组连接可能会产生意想不到的结果。

你想确保

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

【讨论】:

    【解决方案2】:

    解决方案:我将错误的变量传递给 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();
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2020-06-08
      • 2016-08-29
      相关资源
      最近更新 更多