@mark01/express-utils
Version:
npm package that contains utilities for express.js
55 lines (54 loc) • 1.98 kB
JavaScript
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 };