"use strict"; const defaultValue = require("default-value"); const http = require("http"); const chalk = require("chalk"); const util = require("util"); module.exports = function errorHandler(error, _req, res, _next) { console.log(chalk.bold.red("Unhandled error:"), error.stack); /* This extracts any (nested) metadata from chained errors */ let errorContext = (error.getAllContext != null) ? error.getAllContext() : error; console.log(chalk.red("Error metadata:"), util.inspect(errorContext, { colors: true, depth: 5 })); let statusCode = (errorContext.isHttpError && errorContext.statusCode != null) ? errorContext.statusCode : 500; let errorCode = (errorContext.isHttpError && errorContext.errorCode != null) ? errorContext.errorCode : "M_UNKNOWN"; let errorMessage = (statusCode !== 500) ? defaultValue(error.message, http.STATUS_CODES[statusCode]) : "An internal server error occurred. Please contact the server administrator for more information." /* TODO: Add contact details? */ let errorMeta = (errorContext.errorMeta != null) ? errorContext.errorMeta : {}; let errorCodeData = (!errorContext.noErrorCode) ? { errcode: errorCode, error: errorMessage } : {}; res.status(statusCode).json(Object.assign({}, errorMeta, errorCodeData)); };