使用Node.js http.get时,套接字不会显示为closures状态

OS X 10.8.3

节点0.10.0

我正在使用“http”模块来提出FacebookgraphicsAPI的请求。

以下是我传递给“http.get”的选项:

var options = {host: 'graph.facebook.com', port: 80, path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier 

我的代码如下所示:

 http.get(options, function(res) { ...some stuff... DONE(RESULT); //DONE is a callback function }).on('error', function(e) { ...some error handling... }); 

我所观察到的是,我只能做和http.globalAgent.maxSockets一样多的请求。 一旦我达到了这么多的请求,下一个调用http.get永远(显然)连接。 我已经validation,我没有收到错误的请求。

就好像响应进入后套接字没有closures。

有什么我需要做的响应处理程序,以确保套接字的一部分?

这些套接字是否因为默认的keepalive行为而closures?

我应该如何进行debugging呢?

在选项中尝试设置agent: false 。 默认的行为确实是保持HTTP保持连接的连接。

 var options = {host: 'graph.facebook.com', port: 80, path: '/' + fb_id + '/picture', agent: false}; 

节点的http模块声明代理默认为全局代理: http : //nodejs.org/api/http.html#http_http_globalagent ,这意味着无论源自请求的模块如何都保持共享。

顺便说一句,Wes在2013年4月9日20:47回复:无论你加载一个节点模块多less次,它只会被加载一次,并被所有的模块共享。

你遇到的是一个池耗尽问题。 避免它的最简单的方法是使用一个新的代理( http://nodejs.org/api/http.html#http_class_http_agent )与您所需的maxSockets。 请记住,您创build的代理可以在模块之间共享(如果将其放在该模块的导出中)(节点中的模块是有状态的!!!)。

我经历了同样的行为,除了我的连接在超时后终于被重用。 检查连接是否在一段时间(几分钟)后重新使用,并检查响应头是否包含“Connection:keep-alive”。

如果是这种情况,可能的解决scheme是使用“连接:closures”标题而不是保持活动状态,这样就可以像通常的设置那样更早地重新使用连接的连接。 我不确定这是否会导致使用Facebook端点的任何性能问题。

 var options = {host: 'graph.facebook.com', port: 80, path: '/' + fb_id + '/picture', headers: { 'Connection':'Close' } }; 

对于我使用的代理:false没有工作,因为我发送的服务器资源耗尽了大量的请求。