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

inc*_*nez 5 javascript connection-timeout node.js express

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

我也有点困惑,因为无论我看什么,http.request根据以下说法,直到 2 分钟后才应该超时:

Node.js 文档

GitHub 问题#1

GitHub 问题#2

我尝试了几种方法来使其正常工作,包括:设置express的中间件侦听套接字超时并恢复请求;并将超时设置为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);
Run Code Online (Sandbox Code Playgroud)

API URL 有效并且可以工作,因为我已经通过wget和验证了这一点$.ajax,那么如何解决 Node 中的超时问题?

更新

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

inc*_*nez 5

这是一个 nginx 问题,因为我使用它来代理我的 API,所以只需通过设置proxy_read_timeout 180s.

  • 你是一个救星。事实上,[proxy_read_timeout](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout)的默认值是60秒。之后,无论 NodeJS 是否处理完毕,nginx 都会突然关闭请求。 (2认同)