在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上发布了这个问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。