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 分钟后才应该超时:
我尝试了几种方法来使其正常工作,包括:设置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 秒
这是一个 nginx 问题,因为我使用它来代理我的 API,所以只需通过设置proxy_read_timeout 180s
.
归档时间: |
|
查看次数: |
10839 次 |
最近记录: |