const logger = require('../utils/logger'); const errorHandler = (err, req, res, next) => { let error = { ...err }; error.message = err.message; // Log error logger.logError(err, { method: req.method, url: req.originalUrl, ip: req.ip, userAgent: req.get('User-Agent') }); // Mongoose bad ObjectId if (err.name === 'CastError') { const message = 'Invalid ID format'; error = { message, statusCode: 400 }; } // Mongoose duplicate key if (err.code === 11000) { const field = Object.keys(err.keyValue)[0]; const message = `${field} already exists`; error = { message, statusCode: 400 }; } // Mongoose validation error if (err.name === 'ValidationError') { const message = Object.values(err.errors).map(val => val.message).join(', '); error = { message, statusCode: 400 }; } // JWT errors if (err.name === 'JsonWebTokenError') { const message = 'Invalid token'; error = { message, statusCode: 401 }; } if (err.name === 'TokenExpiredError') { const message = 'Token expired'; error = { message, statusCode: 401 }; } // Stripe errors if (err.type && err.type.startsWith('Stripe')) { const message = 'Payment processing error'; error = { message, statusCode: 400 }; } res.status(error.statusCode || 500).json({ success: false, message: error.message || 'Server Error', ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); }; module.exports = errorHandler;