/** * Error Handling Middleware * Centralized error handling for consistent API responses */ /** * Error handler middleware * Catches errors from routes and formats response */ function errorHandler(err, req, res, next) { // Log error for debugging console.error('Error:', err); // Default error response let statusCode = 500; let message = 'Internal server error'; // Handle specific error types if (err.message) { message = err.message; // SQLite constraint errors if (err.message.includes('UNIQUE constraint')) { statusCode = 409; // Conflict message = 'A record with that value already exists'; } else if (err.message.includes('FOREIGN KEY constraint')) { statusCode = 400; // Bad Request message = 'Invalid reference to related record'; } else if (err.message.includes('NOT NULL constraint')) { statusCode = 400; message = 'Required field is missing'; } else if (err.message.includes('CHECK constraint')) { statusCode = 400; message = 'Value does not meet validation requirements'; } // Custom application errors else if (err.message.includes('not found')) { statusCode = 404; } else if (err.message.includes('Cannot delete')) { statusCode = 400; } } // Send error response res.status(statusCode).json({ error: message, ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); } /** * 404 Not Found handler * Catches requests to undefined routes */ function notFoundHandler(req, res) { res.status(404).json({ error: 'Route not found', path: req.path }); } module.exports = { errorHandler, notFoundHandler };