const logger = require('../utils/logger'); const errorHandler = (err, req, res, next) => { // Log error logger.error('Error occurred:', { message: err.message, stack: err.stack, path: req.path, method: req.method, ip: req.ip }); // Sequelize validation errors if (err.name === 'SequelizeValidationError') { const errors = err.errors.map(e => ({ field: e.path, message: e.message })); return res.status(400).json({ success: false, message: 'Validation error', errors }); } // Sequelize unique constraint errors if (err.name === 'SequelizeUniqueConstraintError') { return res.status(409).json({ success: false, message: 'Resource already exists', field: err.errors[0]?.path }); } // JWT errors if (err.name === 'JsonWebTokenError') { return res.status(401).json({ success: false, message: 'Invalid token' }); } if (err.name === 'TokenExpiredError') { return res.status(401).json({ success: false, message: 'Token expired' }); } // Multer file upload errors if (err.name === 'MulterError') { if (err.code === 'LIMIT_FILE_SIZE') { return res.status(413).json({ success: false, message: 'File too large' }); } return res.status(400).json({ success: false, message: err.message }); } // Default error const statusCode = err.statusCode || 500; const message = err.message || 'Internal server error'; res.status(statusCode).json({ success: false, message, ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); }; module.exports = errorHandler;