67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
/**
|
|
* 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
|
|
};
|