'use strict'; // ----------------------------------------------------------------------------- // Error handlers // ----------------------------------------------------------------------------- const container = require('../Container'); const app = container.get('app'); const HTTP_CODE_MAP = require('http').STATUS_CODES; const errors = require('errors'); const negotiate = require('express-negotiate'); let errorHandlers = new Set([ function handle404(req, res, next) { if (! req.route) { // if no route matches, send a 404 let err = new errors.Http404Error(); return next(err); } }, function handle400Errors(err, req, res, next) { if (err instanceof negotiate.NotAcceptable) { // if no content type matches, send a 406 err = new errors.Http406Error(); } return next(err); }, // general error handler function handleError(err, req, res, next) { let httpStatus = err.status || 500; let message = err.message || HTTP_CODE_MAP[httpStatus]; res.status(httpStatus); let output = { status: httpStatus, message: message, }; // Show stack trace in development environment if (app.get('env') === 'development') { output.error = err; } // Send html or json depending on client accept header req.negotiate({ html: () => { res.render('error', { title: `${err.status} ${err.message}`, error: output, }); }, 'application/json': () => { res.json(output); }, }); }, ]); module.exports = errorHandlers;