循环下载器上的Node.js EMFILE错误

时间:2014-02-19 10:01:12

标签: javascript node.js http

我已经用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);
});

1 个答案:

答案 0 :(得分:0)

如果您可以控制服务器,则可以尝试使用ulimit -n增加已打开文件的限制。

如果你无法改变,你可以试着玩graceful-fs模块。