EADDRNOTAVAIL经过多次对localhost的http.get请求

时间:2014-01-08 09:26:35

标签: node.js httprequest

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

破碎时:

  • 无法执行对本地主机的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!");
});

2 个答案:

答案 0 :(得分:11)

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

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

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

通过此更正,上述示例有效。但我仍然在我的生产代码中遇到了EADDRNOTAVAIL问题,所以agent设置为false最后做了

var http = require( "http");

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

我也在GitHub上发布了此问题。

答案 1 :(得分:-1)

MacOS解决方案,或者至少对我有用的enter image description here

并将请求发送到mac.local