原因如下“正好5”: https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets
在内部,http
模块使用代理类来管理 HTTP 请求。默认情况下,该代理最多允许与同一 HTTP 服务器建立 5 个打开连接。
在您的代码中,您不会使用 Google 发送的实际响应。因此,代理假定您尚未完成请求,并将保持连接打开。因此,在 5 个请求之后,代理将不再允许您创建新连接,并将开始等待任何现有连接完成。
显而易见的解决方案是只使用数据:
http.get("http://www.google.com", function(r){
r.on('data', function() { /* do nothing */ });
...
});
如果您遇到了您的问题/api/internetcheck
路由被调用很多,所以你需要允许超过5个并发连接,你可以增加连接池大小,或者完全禁用代理(尽管在这两种情况下你仍然需要消耗数据);
// increase pool size
http.globalAgent.maxSockets = 100;
// disable agent
http.get({ hostname : 'www.google.com', path : '/', agent : false }, ...)
或者也许使用HEAD
请求而不是GET
.
(PS:万一http.get
生成错误,您仍然应该使用以下方式结束 HTTP 响应res.end()
或类似的东西)。
NOTE:在 Node.js 版本 >= 0.11 中,maxSockets
被设定为Infinity https://nodejs.org/api/http.html#http_agent_maxsockets.