我正在使用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分钟之后超时,根据:
我尝试了几项工作,包括:设置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
答案 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;”。您可以通过添加以下代码对其进行修复