运行以下代码以下载和解压缩文件。当我尝试使用它时它按预期工作,但当我同时执行多个时,我得到以下错误:
错误:在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循环并尝试下载/压缩一个商家代码时。
答案 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
。