UNPKG

@mark01/express-utils

Version:

npm package that contains utilities for express.js

55 lines (54 loc) 1.98 kB
import { ZodError } from 'zod'; import { AppError } from './AppError'; export const formatZodError = (error) => { const { issues } = error; if (issues.length) { const { path, message } = issues[0]; const pathString = path.join('.'); return `${pathString}: ${message}`; } return 'Unknown Zod validation error'; }; export const defaultHandleOperationalErrors = (err) => { if (err instanceof SyntaxError) { return new AppError('Invalid JSON! Please provide a valid one.', 400, err); } if ('type' in err && err.type === 'entity.too.large') { return new AppError('Request too large! Please reduce your payload.', 413, err); } if (err instanceof ZodError) { return new AppError(formatZodError(err), 400, err); } console.error(err); return new AppError('Internal Server Error!', 500, err); }; export const errorHandler = (config) => { const { environment, handleOperationalErrors } = config; return (err, _req, res, next) => { const sendErrorResponse = (error) => { const response = { status: 'error', message: error.message, ...(environment === 'development' && { stack: error.stack }), }; res.status(error.statusCode).json(response); }; if (err instanceof AppError) { sendErrorResponse(err); return; } if (err instanceof Error) { const operationalError = handleOperationalErrors?.(err); if (operationalError) sendErrorResponse(operationalError); else sendErrorResponse(defaultHandleOperationalErrors(err)); return; } const unknownError = new AppError('Unknown error! Please try again later.', 500, err); console.error('Unknown error:', err); sendErrorResponse(unknownError); next(); }; }; export { AppError };