【问题标题】:Node.js https.request with keep-alive header带有 keep-alive 标头的 Node.js https.request
【发布时间】:2011-09-14 07:19:41
【问题描述】:

我想从用户 Facebook 墙上拉出帖子。

以下代码 sn-p 有效,但它永远不会终止:

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 还很陌生,所以如果我遗漏了一些明显的东西,我深表歉意。

【问题讨论】:

    标签: facebook node.js https keep-alive


    【解决方案1】:

    这是因为 https/tls/ssl 还没有实现 keep-alive 在节点 4.x 中,我也相信 6.x。这就是为什么在节点 websocket-server 也不行,见https://github.com/nephics/node-websocket-server/commit/3a732bff6aabe694834d87086a7718be7c0ce138

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您必须执行以下操作:

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

        2) 使用 Connection:keep-alive ,“关闭”会导致性能非常差的问题。我已经做了很多测试,我可以确认这一点。

        除此之外:

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

        4) 您应该考虑制定自己的例程来处理 https.request 超时。 (请去github/joyent搜索一下,基本都是用setTimeout发出超时错误)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-15
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          • 2011-10-21
          • 2013-07-10
          • 2016-09-07
          • 1970-01-01
          相关资源
          最近更新 更多