import { logger } from '../utils/logger.js'; export const errorHandler = (err, req, res, next) => { // Log error logger.error('Error occurred:', { error: err.message, stack: err.stack, url: req.url, method: req.method, body: req.body, params: req.params, query: req.query }); // Mongoose validation error if (err.name === 'ValidationError') { const errors = Object.values(err.errors).map(e => e.message); return res.status(400).json({ error: 'Validation failed', details: errors }); } // Mongoose duplicate key error if (err.code === 11000) { const field = Object.keys(err.keyPattern)[0]; return res.status(400).json({ error: 'Duplicate value', field, message: `${field} already exists` }); } // Mongoose cast error if (err.name === 'CastError') { return res.status(400).json({ error: 'Invalid ID format', field: err.path, value: err.value }); } // JWT errors if (err.name === 'JsonWebTokenError') { return res.status(401).json({ error: 'Invalid token' }); } if (err.name === 'TokenExpiredError') { return res.status(401).json({ error: 'Token expired' }); } // Custom business logic errors if (err.message.includes('not found')) { return res.status(404).json({ error: err.message }); } if (err.message.includes('already exists')) { return res.status(409).json({ error: err.message }); } if (err.message.includes('Cannot') || err.message.includes('Invalid')) { return res.status(400).json({ error: err.message }); } // Default error res.status(err.status || 500).json({ error: err.message || 'Internal server error', ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); };