节点服务器,套接字,请求和响应超时
问题
2分钟后节点的默认configuration超时请求。 我想将请求超时更改为:
- 1分钟“正常”请求
- 5分钟用于提供静态文件的请求(在这种情况下是大型资产)
- 上传8小时(每个请求几千张图片)
研究
通过阅读Node的文档 ,我发现有很多定义超时的方法。
- server.setTimeout
- socket.setTimeout
- request.setTimeout
- response.setTimeout
我使用的Express也提供中间件来定义(特定)路由的超时时间。 我试过了, 没有成功 。
题
我很困惑如何正确configuration全局和每个路由超时限制。 我应该configuration所有上述超时? 如何设置服务器的超时时间与设置套接字或请求的超时时间不同?
正如我在关于超时中间件的使用的其他问题上看到的, 您以某种方式不同地使用它。
请参阅超时连接中间件的文档。
将你的errorHandler函数作为EventListener添加到请求中,因为它是一个EventEmitter,中间件使它发出timeout
-event:
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
server.timeout
- 不活动/空闲超时
- 等于套接字超时
- 默认2分钟
server.setTimeout
- 不活动/空闲超时
- 等于套接字超时
- 默认2分钟
- 有callback
socket.setTimeout
- 不活动/空闲超时
- callback负责结束(),销毁()套接字
- 默认没有超时
response.setTimeout
- socket.setTimeout前端
request.setTimeout
- socket.setTimeout前端
expressjs /超时包
- 响应硬超时(vs不活动)
- 有callback
结论
- 最大。 时间允许一个动作(请求+响应),需要快速/超时包。
这正是你所需要的,但是callback需要结束请求/响应。 由于超时只触发callback,它不会改变状态或干扰连接。 这是callback工作。
- 空闲超时,设置nodejs api请求/响应超时
我不build议触摸这些,因为在大多数情况下这是不必要的。 除非你想在2分钟内允许连接闲置(无stream量)。
已经有一个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(); }