Node.js:http请求在1分钟后超时

时间:2014-07-11 14:25:21

标签: javascript node.js express connection-timeout

我正在使用Node.js(版本0.10.28)为我的Ruby API创建http.request以获取大量数据(来自PostgreSQL数据库的21,000行)。问题是请求似乎超时并在1分钟后返回404错误。我知道这是正确的,因为Ruby API为请求返回61秒,并且我计算Node的请求需要多长时间(结果为60秒和404)。但是,如果我wget或使用jQuery的$.ajax超时为4分钟,我可以获得21,000行。很明显,它不能成为404,因为其他方式可以使数据有效。

我也有点困惑,因为在我看的每一个地方,http.request都不应该在2分钟之后超时,根据:

Node.js docs

GitHub issue #1

GitHub issue #2

我尝试了几项工作,包括:设置express's middleware; listening for the socket timeout并恢复请求;并将超时设置为0,因此没有超时。不幸的是,这些方法都不起作用,或者至少从我所理解的方面起作用。

为了清楚起见,这里是我的代码...设置该限制意味着只返回18,000条记录,这似乎是API耗时超过60秒的截止点:

var http = require('http');
var options = {
  path: '/api/records.json?limit=18000',
  method: 'GET',
  host: 'localhost',
  requestCert: true,
  rejectUnauthorized: false
};
var req = http.request(options, function(res) {
  var endDate = new Date();
  console.log('done', endDate - startDate);
  var output = [];
  res.on('data', function(chunk) {
    output.push(chunk);
  });
  res.on('end', function() {
    var data = output.join('');
    console.log(data);
    return {data: data, success: true};
  });
});
req.on('socket', function(socket) {
  socket.setTimeout(0);  // no timeout
  socket.on('timeout', function() {
    socket.resume();  // tried resuming the timeout
  });
});
req.end();
var startDate = new Date();
console.log('starting', startDate);

API网址有效且有效,因为我已通过wget$.ajax验证了这一点,那么如何解决Node中的超时问题?

更新

经过进一步检查,如果我拿出socket.setTimeout(0);并尝试进入socket.on('timeout',我实际上并没有进入回调......这很奇怪,但总是在60秒之前我得到了404

3 个答案:

答案 0 :(得分:1)

这是一个nginx问题,因为我正在使用它代理到我的API,所以通过设置proxy_read_timeout 180s可以简单地更改代理的配置。

答案 1 :(得分:1)

正如你所说这是一个nginx问题,但可能如果你没有在nginx配置中设置代理参数nginx默认取决于操作系统,因为在Ubuntu 16.04中我没有任何问题,10分钟超时没有任何代理参数,但在centos和redhat我看到1分钟的超时限制。

我添加了一个配置示例,因为您需要设置两个比proxy_read_timeout更多的参数:

server {
    listen       80;
    server_name  myserver;

    location / {
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_connect_timeout      180s;
        proxy_send_timeout         180s;
        proxy_read_timeout         180s;

        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }
}

对于这个问题,重要的参数是:

proxy_connect_timeout      180s;
proxy_send_timeout         180s;
proxy_read_timeout         180s;

答案 2 :(得分:0)

朋友遇到了同样的问题工作15天后,问题的根源是“ server.headersTimeout = 7200000;”。您可以通过添加以下代码对其进行修复