带保持活动标头的Node.js https.request

我想从用户的Facebook墙上拉post。

下面的代码片段工作,但它永远不会终止:

var https = require('https'); facebookWall = function(user) { var options = { host: 'graph.facebook.com', port: 443, path: '/me/home?access_token=' + user.facebook_token + '&since=' + encodeURIComponent(user.facebook_timestamp), method: 'GET', headers: { 'Connection':'keep-alive' } }; var req = https.request(options) .on('response', function(response) { var body = ''; response.on('data', function(data) { body += data; try { var wallPosts = JSON.parse(body); console.log("user " + user.id + " has " + wallPosts.data.length + " new items on their wall"); } catch (e) { //console.log("waiting for more data chunks..."); } }) }); req.end(); req.on('error', function(e) { console.error(e); }); } 

我认为这是由'Connection':'keep-alive'引起'Connection':'keep-alive'标题。 当我用'Connection':'close'取代它时'Connection':'close'脚本将在所有数据从facebook中被取回时终止。

我希望能够使用keep-alive头来防止为每个请求创build一个新的SSL连接。 我有成千上万的请求和keep-alive头,它只需几秒钟就完成了,而不用几分钟就没有keep-alive头。

有谁知道如何做到这一点? 我对Node.JS相当陌生,所以如果我错过了一些明显的东西,我很抱歉。

这是因为Keep-alive还没有在节点4.x中为https / tls / ssl实现,我也相信6.x。 这就是为什么在节点websocket服务器它不工作,请参阅https://github.com/nephics/node-websocket-server/commit/3a732bff6aabe694834d87086a7718be7c0ce138

我注意到你正在使用https。 取决于你正在使用的节点版本,但现在有一个已知的结束事件的问题。

https://github.com/joyent/node/issues/728

你必须做到以下几点:

1)把response.on('end',function(){…做输出…}); 对于https.request,不要在response.on('data',…)中输出数据;

2)使用Connection:keep-alive,“close”会导致性能问题很差。 我做了很多testing,我可以证实这一点。

除此之外:

3)在您的选项中,设置代理,并将agent.maxSockets设置为更大的数字(如果需要并发)。 默认只有5个。

4)你应该考虑做你自己的例程来处理https.request超时。 (请到github / joyent并search它,基本上使用setTimeout来发出超时错误)。