具有keep-alive标头的Node.js https.request

时间:2011-06-13 22:52:19

标签: facebook node.js https keep-alive

我想从用户Facebook墙上提取帖子。

以下代码段有效,但永远不会终止:

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':'close'替换它时,脚本将在从facebook检索到所有数据时终止。

我希望能够使用keep-alive标头来防止为每个请求创建新的SSL连接。我有成千上万的请求,并且使用keep-alive标头,它只需几秒钟即可完成,而不是几分钟没有keep-alive标头。

有谁知道如何做到这一点?我对Node.JS很新,所以如果我遗漏了一些明显的东西,我会道歉。

3 个答案:

答案 0 :(得分:5)

这是因为https / tls / ssl尚未实现keep-alive 在节点4.x中,我也相信6.x。这就是节点websocket-server的原因 它不起作用,请参阅https://github.com/nephics/node-websocket-server/commit/3a732bff6aabe694834d87086a7718be7c0ce138

答案 1 :(得分:0)

我注意到你正在使用https。取决于您正在使用的节点版本,但目前终端事件存在已知问题。

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

答案 2 :(得分:0)

您必须执行以下操作:

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

中输出数据

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

除此之外:

3)在您的选项中,设置代理,并在需要并发时将agent.maxSockets设置为更大的数字。默认值仅为5.

4)您应该考虑制定自己的例程来处理https.request超时。 (请转到github / joyent并搜索它。基本上使用setTimeout发出超时错误)。