【问题标题】:How to send consecutive requests with HTTP keep-alive in node.js?如何在 node.js 中使用 HTTP keep-alive 发送连续请求?
【发布时间】:2012-06-09 09:18:23
【问题描述】:

我正在使用 node.js 0.6.18,以下代码使 node.js 关闭每两个请求之间的 TCP 连接(在 Linux 上使用 strace 验证)。如何让 node.js 为多个 HTTP 请求重用相同的 TCP 连接(即保持活动状态)?请注意,网络服务器能够保持活动状态,它可以与其他客户端一起使用。网络服务器返回一个分块的 HTTP 响应。

var http = require('http');
var cookie = 'FOO=bar';
function work() {
  var options = {
      host: '127.0.0.1',
      port: 3333,
      path: '/',
      method: 'GET',
      headers: {Cookie: cookie},
  };
  process.stderr.write('.')
  var req = http.request(options, function(res) {
    if (res.statusCode != 200) {
      console.log('STATUS: ' + res.statusCode);
      console.log('HEADERS: ' + JSON.stringify(res.headers));
      process.exit(1)
    }
    res.setEncoding('utf8');
    res.on('data', function (chunk) {});
    res.on('end', function () { work(); });
  });
  req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
    process.exit(1);
  });
  req.end();
}
work()

【问题讨论】:

  • 你能解决这个问题吗?
  • 您可能想知道调用 work() 会造成堆栈内存泄漏。这是因为每个结束事件都会添加一个对 work() 的新调用,除非每个调用的结束事件都完成,否则永远不会释放堆栈。要解决此问题,您可能希望通过调用“process.nextTick(work);”将 work() 推出范围。这将允许结束处理程序的范围终止。

标签: http node.js client keep-alive


【解决方案1】:

我能够通过创建http.Agent 并将其maxSockets 属性设置为1 来使其工作(通过strace 验证)。我不知道这是否是理想的方法;但是,它确实符合要求。我确实注意到的一件事是,文档所声称的 http.Agent 行为并没有准确地描述它在实践中是如何工作的。代码如下:

var http = require('http');
var cookie = 'FOO=bar';
var agent = new http.Agent;
agent.maxSockets = 1;

function work() {
  var options = {
      host: '127.0.0.1',
      port: 3000,
      path: '/',
      method: 'GET',
      headers: {Cookie: cookie},
      agent: agent
  };
  process.stderr.write('.')
  var req = http.request(options, function(res) {
    if (res.statusCode != 200) {
      console.log('STATUS: ' + res.statusCode);
      console.log('HEADERS: ' + JSON.stringify(res.headers));
      process.exit(1)
    }
    res.setEncoding('utf8');
    res.on('data', function (chunk) {});
    res.on('end', function () { work(); });
  });
  req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
    process.exit(1);
  });
  req.end();
}
work()

编辑:我应该补充一点,我使用 node.js v0.8.7 进行了测试

【讨论】:

  • 也许它并不完全关心最重要的问题,但您的代码解决了我的问题。我试图在选项中设置一个 cookie 和一个“直接”引用,但现在我将它设置在标题上:{} 并且知道我的 htttp/get/cookies 请求工作正常。谢谢!
【解决方案2】:

你可以设置:

http.globalAgent.keepAlive = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多