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

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

我也有点困惑,因为在我看来, http.request是不应该超时,直到2分钟后,根据:

Node.js文档

GitHub问题#1

GitHub问题#2

我已经尝试了几件事情来做到这一点,包括:设置快递的中间件 ; 侦听套接字超时并恢复请求; 并将超时设置为0,所以没有超时。 不幸的是,这些方式都没有奏效,至less从我所理解的方面来看是如此。

为了清楚起见,这是我的代码…设置限制意味着只返回18000条logging,这似乎是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的URL是有效的,正如我已经通过wget$.ajaxvalidation,那么如何解决Node中的超时问题?

UPDATE

进一步检查,如果我把socket.setTimeout(0); 并试图进入socket.on('timeout' ,我实际上并没有进入callback…这是奇怪的,但总是60秒之前,我得到404

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

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

 server { listen 80; server_name ~^(?<sub>.+)\.(.*)\.(.*)$; location / { # Use subnet DNS: resolver dnsmasq; proxy_pass http://$sub; 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; 

这是一个nginx问题,因为我使用它来代理我的API,所以通过设置proxy_read_timeout 180s简单地改变代理的configuration。