UNPKG

@dwp/govuk-casa

Version:

A framework for building GOVUK Collect-And-Submit-Applications

88 lines (78 loc) 2.95 kB
// 2 middleware: one as a fallback 404 handler, one to handle thrown errors import logger from "../lib/logger.js"; /** * @typedef {import("express").RequestHandler} RequestHandler * @access private */ const log = logger("middleware:post"); /** @returns {RequestHandler[]} Middleware functions */ export default function postMiddleware() { return [ (req, res) => { res.status(404).render("casa/errors/404.njk"); }, /* eslint-disable-next-line no-unused-vars */ (err, req, res, next) => { // In some cases, an error may have been thrown before the template assets // have had a chance to initialise. So we use a hardcoded template in // these cases to ensure the user sees an appropriate message. let TEMPLATE = "casa/errors/500.njk"; if (!res.locals.t) { res.locals.t = () => ""; res.locals.casa = { ...res.locals?.casa, mountUrl: `${req.baseUrl}/`, }; TEMPLATE = "casa/errors/static.njk"; } // CSRF token is invalid in some way if (err?.code === "EBADCSRFTOKEN") { log.info( "CSRF validation has failed. This may be caused by the user submitting a stale form from a previous session [EBADCSRFTOKEN]", ); return res .status(403) .render(TEMPLATE, { errorCode: "bad_csrf_token", error: err }); } // Body parsing verification check failed if (err?.type === "entity.verify.failed") { log.info( "Body parser verification has failed. This has been caused by the user submitting a payload containing invalid data [entity.verify.failed]", ); return res .status(403) .render(TEMPLATE, { errorCode: "invalid_payload", error: err }); } // Too many parameters submitted if (err?.type === "parameters.too.many") { log.info( "The request contains more parameters than is currently allowed [parameters.too.many]", ); return res.status(413).render(TEMPLATE, { errorCode: "parameter_limit_exceeded", error: err, }); } // Overall payload too large if (err?.type === "entity.too.large") { log.info( `The request payload is too large. Received ${err.length}b with a maximum of ${err.limit}b [parameters.too.many]`, ); return res .status(413) .render(TEMPLATE, { errorCode: "payload_size_exceeded", error: err }); } // Unaccept request method if (err?.code === "unaccepted_request_method") { log.info(err.message); return res.status(400).render(TEMPLATE, { errorCode: "unaccepted_request_method", error: err, }); } // Unknown error log.error(`Unknown error: ${err.message}; stacktrace: ${err.stack}`); return res.status(200).render(TEMPLATE, { error: err }); }, ]; }