portfolio-page/backend/middleware/errorHandlers.js

66 lines
1.6 KiB
JavaScript

// Error handling middleware
export const errorHandler = (err, req, res, next) => {
console.error('Error occurred:', {
message: err.message,
stack: err.stack,
url: req.url,
method: req.method,
ip: req.ip,
userAgent: req.get('User-Agent'),
timestamp: new Date().toISOString(),
});
// Default error
let error = {
success: false,
message: 'Internal server error',
...(process.env.NODE_ENV === 'development' && {
error: err.message,
stack: err.stack,
}),
};
// Rate limit error
if (err.status === 429) {
error = {
success: false,
message: 'Too many requests. Please try again later.',
retryAfter: err.retryAfter,
};
}
// Validation errors
if (err.name === 'ValidationError') {
error = {
success: false,
message: 'Validation failed',
errors: Object.values(err.errors).map((e) => e.message),
};
}
// JSON parsing errors
if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
error = {
success: false,
message: 'Invalid JSON in request body',
};
}
res.status(err.status || 500).json(error);
};
export const notFoundHandler = (req, res) => {
res.status(404).json({
success: false,
message: `Route ${req.method} ${req.url} not found`,
availableRoutes: {
'GET /health': 'Health check endpoint',
'POST /api/contact': 'Send contact form email',
...(process.env.NODE_ENV === 'development' && {
'GET /api/contact/test': 'Test contact API (development only)',
}),
},
});
};