UNPKG

@apolitical/server

Version:

Node.js module to encapsulate Apolitical's express server setup

60 lines (58 loc) 1.99 kB
'use strict'; module.exports = ({ httpStatusCodes: { FORBIDDEN, INTERNAL_SERVER_ERROR, TEMPORARY_REDIRECT }, config: { JWT: { AUTH0 }, }, logger, loggerHelper: { getUserId }, serverError: { GeneralError }, }) => ({ labels, redirectURL, fallbackController }) => { // eslint-disable-next-line no-unused-vars return function handler(err, req, res, next) { // Initialise variables let code = INTERNAL_SERVER_ERROR; let message = 'Unexpected error'; let errors = []; // Parse errors if (err instanceof GeneralError) { code = err.code; message = err.message; errors = err.errors; } else { const { name, message: errorMessage } = err; if (name === AUTH0.ERRORS.UNAUTHORIZED) { code = FORBIDDEN; message = `Unauthorized error: ${errorMessage}`; errors = ['auth0-token']; } else { code = INTERNAL_SERVER_ERROR; message = `Unexpected error: ${errorMessage}`; errors = ['unknown-error']; } } // Log the error with all the relevent info const userId = getUserId(req); if (req.log) { req.log.warn(message, { errors, userId }); } else { const errorLogger = logger.where(__filename, 'handler', labels); errorLogger.warn(message, { errors, userId }); } // Use the redirect URL to redirect the request if (redirectURL) { return res.redirect(TEMPORARY_REDIRECT, `${redirectURL}?errorMessage=${encodeURI(message)}`); } // Use the fallback controller to handle the response if (fallbackController) { // more known error messages can be added here if (message === 'Unexpected error: Cannot read items') { return fallbackController(req, res); } } // Use the info on the error to send the response return res.status(code).json({ message, errors }); }; };