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

时间:2016-08-12 20:45:42

标签: node.js express

问题

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

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

研究

通过Node's documentation阅读,我发现有很多方法可以定义超时。

  1. server.setTimeout
  2. socket.setTimeout
  3. request.setTimeout
  4. response.setTimeout
  5. 我正在使用Express,它还提供middleware来定义(特定)路由的超时。我试过了,without success

    问题

    我对如何在全局和每条路由上正确配置超时限制感到困惑。我应该配置以上所有超时吗?如何设置服务器的超时与设置套接字或请求的超时不同?

3 个答案:

答案 0 :(得分:3)

摘要

  • nodejs timeout API都是非活动超时
  • expressjs / timeout包是响应硬超时

nodejs timeout API

<强> server.timeout

  • 不活动/空闲超时
  • 等于套接字超时
  • 默认2分钟

<强> server.setTimeout

  • 不活动/空闲超时
  • 等于套接字超时
  • 默认2分钟
  • 有回电

<强> socket.setTimeout

  • 不活动/空闲超时
  • 对end(),destroy()socket
  • 负责的回调
  • 默认无超时

<强> response.setTimeout

  • socket.setTimeout前端

<强> request.setTimeout

  • socket.setTimeout前端

expressjs / timeout package

  • 响应硬超时(vs非活动)
  • 有回电

结论

  • 最大。允许进行操作的时间(请求+响应),需要快速/超时包。
      

    这正是您所需要的,但回调需要结束请求/响应。由于超时仅触发回调,因此不会更改状态或干扰连接。这是回调工作。

  • 空闲超时,设置nodejs api请求/响应超时
      

    我不建议触摸这些,因为在大多数情况下不需要。除非您希望在2分钟内允许连接空闲(无流量)。

答案 1 :(得分:3)

正如我在your other question concerning the usage of the timeout middleware上看到的那样,你以不同的方式使用它。

请参阅timeout-connect middleware.

的文档

将errorHandler-function作为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)的函数调用无效。此外,您必须记住,如果在请求挂在服务器端时发生超时,则必须阻止服务器代码进一步处理此请求(因为标头已经发送且其基础连接将不再可用)。

答案 2 :(得分: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();
}