带保持活动标头的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。 取决于你正在使用的节点版本,但现在有一个已知的结束事件的问题。
你必须做到以下几点:
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来发出超时错误)。