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); }; };