1

My code:

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

When user requesting. Node.js processes "DO SOMETHING1-3". But before it processed. Timeout middleware response because it has been set for 5 seconds. After that in line 7 routing try to response again. And Its causes Error "Can't set headers after they are sent."

How to handle the problem ?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
bookotl
  • 68
  • 7

1 Answers1

2

I had a feeling this would be a common problem, so I searched the GitHub repository and found this issue.

In this answer, I will outline the two possible solutions proposed in the issue I linked above:

  1. You could check to see if the request has timed out via the req.timedout property before calling 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. Or you could mount some top-level middleware which effectively suppresses the error:

    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();
    });
    
Alex Booker
  • 10,487
  • 1
  • 24
  • 34