65 lines
1.4 KiB
TypeScript
65 lines
1.4 KiB
TypeScript
import { Request, Response, NextFunction } from 'express';
|
|
import logger from '../utils/logger';
|
|
|
|
export class AppError extends Error {
|
|
statusCode: number;
|
|
isOperational: boolean;
|
|
|
|
constructor(message: string, statusCode: number = 500) {
|
|
super(message);
|
|
this.statusCode = statusCode;
|
|
this.isOperational = true;
|
|
|
|
Error.captureStackTrace(this, this.constructor);
|
|
}
|
|
}
|
|
|
|
export const errorHandler = (
|
|
err: Error | AppError,
|
|
req: Request,
|
|
res: Response,
|
|
_next: NextFunction
|
|
): void => {
|
|
if (err instanceof AppError) {
|
|
logger.error('Application Error', {
|
|
message: err.message,
|
|
statusCode: err.statusCode,
|
|
stack: err.stack,
|
|
path: req.path,
|
|
method: req.method,
|
|
});
|
|
|
|
res.status(err.statusCode).json({
|
|
status: 'error',
|
|
message: err.message,
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Handle unexpected errors
|
|
logger.error('Unexpected Error', {
|
|
message: err.message,
|
|
stack: err.stack,
|
|
path: req.path,
|
|
method: req.method,
|
|
});
|
|
|
|
res.status(500).json({
|
|
status: 'error',
|
|
message: 'An internal error occurred',
|
|
});
|
|
};
|
|
|
|
export const notFoundHandler = (req: Request, res: Response): void => {
|
|
res.status(404).json({
|
|
status: 'error',
|
|
message: `Route ${req.originalUrl} not found`,
|
|
});
|
|
};
|
|
|
|
export const asyncHandler = (fn: Function) => {
|
|
return (req: Request, res: Response, next: NextFunction) => {
|
|
Promise.resolve(fn(req, res, next)).catch(next);
|
|
};
|
|
};
|