快速中间件"connect-timeout"原因"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行路由尝试再次响应。它会导致错误"发送后不能设置标头"。

如何处理这个问题?

我有一种感觉,这将是一个常见的问题,所以我搜索了GitHub存储库,发现了这个问题。

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

  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();
    });
    

相关内容

最新更新