Express 中间件 "connect-timeout" 导致 "Can't set headers after they are sent."

Express middleware "connect-timeout" causes "Can't set headers after they are sent."

我的代码:

timeout = require('connect-timeout')

app.get('/', timeout('5s'), function(req, res){
  ##DO SOMETHING 1
  ##DO SOMETHING 2
  ##DO SOMETHING 3
  res.send('ok'); ##line 7
});

当用户请求时。 Node.js 进程 "DO SOMETHING1-3"。但在它处理之前。超时中间件响应,因为它已经设置了 5 秒。之后在第 7 行路由中再次尝试响应。及其导致错误 "Can't set headers after they are sent."

如何处理问题?

我觉得这会是一个常见问题,所以我搜索了 GitHub repository and found this issue

在这个回答中,我将概述我在上面链接的问题中提出的两种可能的解决方案:

  1. 您可以在调用 res.send:

    之前通过 req.timedout 属性 检查请求是否超时
    app.get('/', timeout('5s'), function(req, res){
      ##DO SOMETHING 1
      ##DO SOMETHING 2
      ##DO SOMETHING 3
      if (!req.timedout) {
        res.send('ok'); ##line 7
      }
    });
    
  2. 或者你可以安装一些顶级中间件来有效地抑制错误:

    app.use(function(req,res,next){
      var _send = res.send;
      var sent = false;
      res.send = function(data){
          if(sent) return;
          _send.bind(res)(data);
          sent = true;
      };
      next();
    });