【问题标题】:Incorrect header check zlib不正确的标头检查 zlib
【发布时间】:2015-09-21 18:19:42
【问题描述】:

运行以下代码以下载和解压缩文件。当我尝试使用一个时,它按预期工作,但是当我同时执行多个时,我收到以下错误:

错误:Zlib._handle.onerror 中的标头检查不正确

var downloadUnzipFile = function (mID) {
      try {
        // Read File    
        console.log("Started download/unzip of merchant: " + mID + " @ " + new Date().format('H:i:s').toString());
        request(linkConst(mID))
          // Un-Gzip
          .pipe(zlib.createGunzip())
          // Write File
          .pipe(fs.createWriteStream(fileName(mID)))
          .on('error', function (err) {
            console.error(err);
          })
          .on('finish', function() {
            console.log("CSV created: " + fileName(mID));
            console.log("Completed merchant: " + mID + " @ " + new Date().format('H:i:s').toString());
            //console.log("Parsing CSV...");
            //csvReader(fileName);
          });

      } catch (e) {
        console.error(e);
      }
    }


    module.exports = function(sMerchants) {
      var oMerchants = JSON.parse(JSON.stringify(sMerchants));
      oMerchants.forEach(function eachMerchant(merchant) {
        downloadUnzipFile(merchant.merchant_aw_id);
      })
    };

有什么想法吗? 谢谢

编辑:

为了澄清,我想遍历数组(商家)中的每个项目(商家)并下载文件+解压缩。我目前这样做的方式意味着这种下载/压缩同时发生(我认为这可能导致错误)。当我删除 foreach 循环并尝试下载/压缩一个商家时,代码有效。

【问题讨论】:

  • "One", "multiple" - 你的意思是,一次一个文件而不是顺序的一些文件?

标签: javascript node.js asynchronous foreach


【解决方案1】:

是的,正如您所建议的,如果您尝试同时解压缩太多文件,您可能会耗尽内存。因为您正在处理流,所以解压缩操作是异步的,这意味着您的 forEach 循环将在每个解压缩操作完成之前继续被调用。有很多节点包允许您处理异步操作,因此您可以按顺序运行解压缩函数,但最简单的方法可能只是使用递归函数调用。例如:

var downloadUnzipFile = function (mID) {
  try {
    // Read File    
    console.log("Started download/unzip of merchant: " + mID + " @ " + new Date().format('H:i:s').toString());
    return request(linkConst(mID))
      // Un-Gzip
      .pipe(zlib.createGunzip())
      // Write File
      .pipe(fs.createWriteStream(fileName(mID)))
  } catch (e) {
    console.log(e);
    return false;
  }
}


module.exports = function(sMerchants) {
  var merchants = JSON.parse(JSON.stringify(sMerchants)),
      count = 0;

  downloadUnzipFile(merchants[count][merchant_aw_id])
    .on('error', function(err){
      console.log(err);
      // continue unzipping files, even if you encounter an error.  You can also remove these lines if you want the script to exit.
      if(merchants[++count]){
        downloadUnzipFile(merchants[count][merchant_aw_id]);
      }
    })
    .on('finish', function() {
      if(merchants[++count]){
        downloadUnzipFile(merchants[count][merchant_aw_id]);
      }
    });
};

当然没有测试过。主要思想应该是:只要之前的调用出错或完成,只要商人数组中仍有项目,就递归调用downloadUnzipFile

【讨论】:

  • 虽然,现在我重新阅读了您的问题,您遇到的错误与内存无关,而是与尝试解压缩 zlib 不支持的文件有关。见stackoverflow.com/questions/31438855/…。但是,如果您同时运行请求,您仍然可能会遇到处理内存的问题。
猜你喜欢
  • 2015-05-29
  • 2015-09-25
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2018-12-13
  • 2021-08-31
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多