@apolitical/server
Version:
Node.js module to encapsulate Apolitical's express server setup
60 lines (58 loc) • 1.99 kB
JavaScript
;
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 });
};
};