import { Request, Response, NextFunction } from 'express'; import { AppError, ValidationError } from '../errors'; import { logger } from './requestLogger'; /** * Global error handler middleware. * Catches all errors, logs unexpected ones with Pino, and returns safe JSON responses. * Must be registered AFTER all routes. */ export const errorHandler = ( err: Error, req: Request, res: Response, _next: NextFunction ) => { if (err instanceof AppError) { return res.status(err.statusCode).json({ status: 'error', message: err.message, ...(err instanceof ValidationError && err.errors ? { errors: err.errors } : {}), }); } // Log unexpected errors logger.error({ error: err.message, stack: err.stack, url: req.url, method: req.method, }); // Don't leak error details in production const message = process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message; res.status(500).json({ status: 'error', message, }); };