node.js – 在对localhost的许多http.get请求之后的EADDRNOTAVAIL

在28233个请求之后对localhost(Apache)执行许多http.get请求时,我得到了EADDRNOTAVAIL.

破碎时:

>我无法对localhost进行http.request(约10秒)(EADDRNOTAVAIL)

而这10秒钟

>我可以做curl http:// localhost(在Apache中没有错误,它仍然像魅力一样工作)
>我可以执行http.get-request(从node.js)到www.google.com(错误只会影响对localhost的请求)

10秒后

>我可以再次对localhost执行http.request(就好像node.js已经自愈了)

这是代码

var http = require( "http");

function httpRequest( callback ) {
    var options = {
            host: 'localhost',port: 80,path: ''
        },data = "";

    http.get(options,function(resp){
        resp.on('data',function( chunk ){   
            data += chunk;
        }).on("end",function() {
            callback( null,data );
        });
    }).on("error",function(e){
            callback( e );
    });
}

function loop( i,callback ) {
    if( i < 100000 ) {
        httpRequest( function( err,data ) {
            if( err ) {
                console.log( "Error!",i,err );
                return;
            }
            if( i % 1000 === 0 ) {
                console.log( i );
            }
            loop( i+1,callback );
        });
    } else {
        callback();
    }
}

console.log( "GO!");
loop( 0,function() {
   console.log( "READY!");
});

解决方法

我通过覆盖认的全局代理找到了解决方案.一种可能是设置maxSockets:1:

var http = require( "http"),agent = new http.Agent( {maxSockets: 1} ); // <-- this is new

function httpRequest( callback ) {
    var options = {
            host: 'localhost',path: '',agent: agent // <-- and this is new
        },...

通过此更正,上面的示例有效.但是我的生产代码中仍然存在EADDRNOTAVAIL问题,因此将代理程序设置为false最终会:

var http = require( "http");

function httpRequest( callback ) {
    var options = {
            host: 'localhost',agent: false // <-- here
        },...

我也在GitHub上发布了这个问题.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...