问题
节点的默认配置在2分钟后超时请求。我想将请求超时更改为:
- "正常"请求1分钟
- 5分钟用于提供静态文件的请求(在这种情况下是大资产(
- 上传8小时(每次请求几千张图片(
研究
通过阅读Node的文档,我发现有很多方法可以定义超时。
- server.setTimeout
- socket.setTimeout
- request.setTimeout
- response.setTimeout
我使用的是Express,它还提供了中间件来定义(特定(路由的超时。我试过了,但没有成功。
问题
我对如何正确配置全局和每条路由的超时限制感到困惑。我应该配置以上所有超时吗?设置服务器的超时与设置套接字或请求的超时有何不同?
正如我在您的另一个关于超时中间件使用的问题上看到的,您使用它的方式有所不同。
请参阅超时连接中间件的文档。
将errorHandler函数作为EventListener添加到请求中,因为它是一个EventEmitter,中间件会使它发出timeout
-事件:
req.on("timeout", function (evt) {
if (req.timedout) {
if (!res.headersSent) {
res
.status(408)
.send({
success: true,
message: 'Timeout error'
});
}
}
});
这是在中间件堆栈之外调用的,导致对next(err)
的函数调用无效。此外,您必须记住,如果在服务器端挂起请求时发生超时,则必须阻止服务器代码进一步处理此请求(因为标头已经发送,其底层连接将不再可用(。
摘要
- nodejs超时API都是非活动超时
- expressjs/timeout包是响应硬超时
nodejs超时API
服务器超时
- 不活动/空闲超时
- 等于套接字超时
- 默认2分钟
服务器.setTimeout
- 不活动/空闲超时
- 等于套接字超时
- 默认2分钟
- 有回调
socket.setTimeout
- 不活动/空闲超时
- 回调负责end((、destroy((套接字
- 默认无超时
响应.setTimeout
- socket.set前端超时
请求.setTimeout
- socket.set前端超时
expressjs/timeout包
- 响应硬超时(相对于不活动(
- 有回调
结论
- 最大。操作(请求+响应(允许的时间,需要快速/超时包。
这正是您所需要的,但回调需要结束请求/响应。由于超时仅触发回调,因此不会更改状态或干扰连接。这是回调作业。
- 空闲超时,设置nodejs-api请求/响应超时
我不建议触摸这些,因为在大多数情况下没有必要。除非您想允许连接空闲(无流量(超过2分钟。
已经有一个Connect Middleware for Timeout支持。你可以试试这个中间件。
var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4
app.use(timeout(120000)); // should be changed with your desire time
app.use(haltOnTimedout);
function haltOnTimedout(req, res, next){
if (!req.timedout) next();
}