58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
function errorHandler(error, req, res, next) {
|
|
console.error('Error occurred:', error);
|
|
|
|
// Default error response
|
|
let statusCode = 500;
|
|
let message = 'Internal server error';
|
|
let details = null;
|
|
|
|
// Handle specific error types
|
|
if (error.name === 'ValidationError') {
|
|
statusCode = 400;
|
|
message = 'Validation error';
|
|
details = error.details || error.message;
|
|
} else if (error.name === 'UnauthorizedError') {
|
|
statusCode = 401;
|
|
message = 'Unauthorized';
|
|
} else if (error.name === 'SequelizeValidationError') {
|
|
statusCode = 400;
|
|
message = 'Database validation error';
|
|
details = error.errors.map(err => ({
|
|
field: err.path,
|
|
message: err.message
|
|
}));
|
|
} else if (error.name === 'SequelizeUniqueConstraintError') {
|
|
statusCode = 409;
|
|
message = 'Resource already exists';
|
|
details = error.errors.map(err => ({
|
|
field: err.path,
|
|
message: err.message
|
|
}));
|
|
} else if (error.name === 'SequelizeForeignKeyConstraintError') {
|
|
statusCode = 400;
|
|
message = 'Invalid reference';
|
|
} else if (error.status) {
|
|
statusCode = error.status;
|
|
message = error.message;
|
|
}
|
|
|
|
// Send error response
|
|
const response = {
|
|
success: false,
|
|
message,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
|
|
// Include error details in development
|
|
if (process.env.NODE_ENV === 'development') {
|
|
response.error = details || error.message;
|
|
response.stack = error.stack;
|
|
} else if (details) {
|
|
response.details = details;
|
|
}
|
|
|
|
res.status(statusCode).json(response);
|
|
}
|
|
|
|
module.exports = errorHandler;
|