我已经用node.js编写了一个img下载程序,用于备份我们的一些文件(一个巨大的应用程序的一部分)。
它在很多情况下都有效,但今天我必须对新服务器应用相同的操作,并且我遇到了EMFILE错误(根据我的研究,打开的文件太多)。
有人可以向我解释为什么会这样,以及我能做些什么才能使它发挥作用?
以下是代码:
function dlImages(uniqImgs){
var image = uniqImgs.shift();
var imglink = image.link_img;
var imgname = image.id+".jpg"
if(imglink.indexOf('http')===-1){
dlImages(uniqImgs);
}
var file = fs.createWriteStream('./WIDB/'+imgname);
try{
http.get(imglink, function(response) {
response.pipe(file);
file.on('finish', function() {
console.log(((totalImg-uniqImgs.length)/totalImg)*100);
file.close();
if(uniqImgs.length>0){
dlImages(uniqImgs);
}else{
process.exit(66);
}
}).on('error', function(err){
console.log(err);
if(uniqImgs.length>0){
dlImages(uniqImgs);
}else{
process.exit(66);
}
});
}).on('error', function(err){
console.log(err);
if(uniqImgs.length>0){
dlImages(uniqImgs);
}else{
process.exit(66);
}
}).setTimeout(5000,function(){
console.log(imglink + ' TIMEDOUT ');
dlImages(uniqImgs);
});
}catch(e){
console.log(e);
dlImages(uniqImgs);
}
}
db.getWILinks(function(links){ //gives back an array of objects = {id:xxx,link_img:xxx}
uniqImgs = links;
totalImg = uniqImgs.length;
dlImages(uniqImgs);
});