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



问题

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

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

研究

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

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

最新更新