节点服务器,套接字,请求和响应超时

问题

2分钟后节点的默认configuration超时请求。 我想将请求超时更改为:

  • 1分钟“正常”请求
  • 5分钟用于提供静态文件的请求(在这种情况下是大型资产)
  • 上传8小时(每个请求几千张图片)

研究

通过阅读Node的文档 ,我发现有很多定义超时的方法。

  1. server.setTimeout
  2. socket.setTimeout
  3. request.setTimeout
  4. 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(); }