JaneJeon/express-objection-starter

View on GitHub
middlewares/error-handler.js

Summary

Maintainability
A
0 mins
Test Coverage
// istanbul ignore file
const { ValidationError, NotFoundError, DBError } = require('objection')
const { JsonWebTokenError } = require('jsonwebtoken')

// eslint-disable-next-line no-unused-vars
module.exports = (err, req, res, next) => {
  if (res.headersSent) {
    req.log.error({ req, err, res }, 'an error occurred after request was sent')
    return
  }

  if (!err.statusCode) {
    if (err instanceof ValidationError || err instanceof JsonWebTokenError) {
      err.statusCode = 400
    } else if (err instanceof NotFoundError) err.statusCode = 404
    else if (err instanceof DBError) {
      err.statusCode = (() => {
        switch (err.name) {
          case 'NotNullViolationError':
          case 'CheckViolationError':
          case 'DataError':
          case 'ConstraintViolationError':
            return 400
          case 'UniqueViolationError':
          case 'ForeignKeyViolationError':
            return 409
          default:
            return 500
        }
      })()
    } else err.statusCode = 500
  }

  res.status(err.statusCode).send({
    message: err.message,
    name: err.name
  })

  err.stack = err.stack.substring(0, err.stack.indexOf('at newFn')).trimRight()
  req.log[err.status < 500 ? 'warn' : 'error'](err)
}