Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Express Error Handling - Get Status Code

If I define error handling middleware with express like so:

app.use(function(err,req,res,next){
    // Do Stuff
});

How do I get the HTTP status code of the error(or do I just assume is's a 500)?

Thanks,
Ari

like image 715
Ari Porad Avatar asked Dec 27 '22 07:12

Ari Porad


2 Answers

In short, your code has to decide the appropriate error code based on the specific error you are handling within your error handling middleware.

There is not necessarily an HTTP status code generated at this point. By convention, when I call next(error) from a middleware function or router handler function, I put a code property so my error handling middleware can do res.status(err.code || 500).render('error_page', error); or something along those lines. But it's up to you whether you want to use this approach for your common 404 errors or only 5XX server errors or whatever. Very few things in express itself or most middleware will provide an http status code when passing an error to the next callback.

For a concrete example, let's say someone tried to register a user account in my app with an email address that I found already registered in the database, I might do return next(new AlreadyRegistered()); where the AlreadyRegistered constructor function would put a this.code = 409; //Conflict property on the error instance so the error handling middleware would send that 409 status code. (Whether it's better to use error handling middleware vs just dealing with this during the normal routing chain for this "normal operating conditions" error is arguable in terms of design, but hopefully this example is illustrative nonetheless).

FYI I also recommend the httperrors npm module which provides nicely-named wrapper classes with a statusCode property. I have used this to good effect in a few projects.

like image 58
Peter Lyons Avatar answered Dec 28 '22 23:12

Peter Lyons


You could try to define the status code in the route:

app.get('/force-error', function(req, res) {
  res.status(400)
  next(new Error('Bad Request.'))
})

Then:

server.use(function serverErrorHandler (err, req, res, next) {
  const code = res.statusCode

  // if status 200 change to 500, otherwise get the defined status code
  res.status(code === 200 ? 500 : code)

  // check if it's a ajax request
  if (req.xhr)
    res.json({
      error: {
        status: res.statusCode,
        message: err.message,
        stack: err.stack,
      }
    })
  else
    next(err)
})
like image 41
Arthur Ronconi Avatar answered Dec 29 '22 00:12

Arthur Ronconi