标头检查zlib不正确

时间:2015-07-03 22:10:43

标签: javascript node.js asynchronous foreach

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

  

错误:在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循环并尝试下载/压缩一个商家代码时。

1 个答案:

答案 0 :(得分:0)

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

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