Express中间件“connect-timeout”导致“发送后无法设置标头”。

时间:2015-10-14 09:20:44

标签: node.js express connect-timeout

我的代码:

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行路由尝试再次响应。它的原因错误“发送后无法设置标题。”

如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

我觉得这是一个常见的问题,因此我搜索了GitHub repository并找到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();
    });