1

我的代码:

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 处理“做某事1-3”。但在它处理之前。超时中间件响应,因为它已设置为 5 秒。之后在第 7 行路由尝试再次响应。并导致错误“发送后无法设置标头”。

如何处理问题?

4

1 回答 1

2

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

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

  1. req.timedout您可以在调用之前通过属性检查请求是否已超时res.send

    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();
    });
    
于 2015-10-14T09:36:19.020 回答