easy-express-cwa
Version:
CLI tool to setup a common Express.js backend developed by codewithashim
77 lines (70 loc) • 2.44 kB
text/typescript
/* eslint-disable no-console */
/* eslint-disable no-unused-vars */
/* eslint-disable no-unused-expressions */
/* eslint-disable @typescript-eslint/no-unused-vars */
import { ErrorRequestHandler, NextFunction, Request, Response } from 'express';
import config from '../../config';
import ApiError from '../../errors/ApiError';
import handleValidationError from '../../errors/handleValidationError';
import { ZodError } from 'zod';
import handleCastError from '../../errors/handleCastError';
import handleZodError from '../../errors/handleZodError';
import { IGenericErrorMessage } from '../../interfaces/error';
import { errorLogger } from '../../shared/logger';
const globalErrorHandler: ErrorRequestHandler = (
error,
req: Request,
res: Response,
next: NextFunction
) => {
config.env === 'development'
? console.log(`🐱🏍 globalErrorHandler ~~`, { error })
: errorLogger.error(`🐱🏍 globalErrorHandler ~~`, error);
let statusCode = 500;
let message = 'Something went wrong !';
let errorMessages: IGenericErrorMessage[] = [];
if (error?.name === 'ValidationError') {
const simplifiedError = handleValidationError(error);
statusCode = simplifiedError.statusCode;
message = simplifiedError.message;
errorMessages = simplifiedError.errorMessages;
} else if (error instanceof ZodError) {
const simplifiedError = handleZodError(error);
statusCode = simplifiedError.statusCode;
message = simplifiedError.message;
errorMessages = simplifiedError.errorMessages;
} else if (error?.name === 'CastError') {
const simplifiedError = handleCastError(error);
statusCode = simplifiedError.statusCode;
message = simplifiedError.message;
errorMessages = simplifiedError.errorMessages;
} else if (error instanceof ApiError) {
statusCode = error?.statusCode;
message = error.message;
errorMessages = error?.message
? [
{
path: '',
message: error?.message,
},
]
: [];
} else if (error instanceof Error) {
message = error?.message;
errorMessages = error?.message
? [
{
path: '',
message: error?.message,
},
]
: [];
}
res.status(statusCode).json({
success: false,
message,
errorMessages,
stack: config.env !== 'production' ? error?.stack : undefined,
});
};
export default globalErrorHandler;