77 lines
1.7 KiB
JavaScript
77 lines
1.7 KiB
JavaScript
const logger = require('../utils/logger');
|
|
|
|
const errorHandler = (err, req, res, next) => {
|
|
// Log error
|
|
logger.error('Error occurred:', {
|
|
message: err.message,
|
|
stack: err.stack,
|
|
path: req.path,
|
|
method: req.method,
|
|
ip: req.ip
|
|
});
|
|
|
|
// Sequelize validation errors
|
|
if (err.name === 'SequelizeValidationError') {
|
|
const errors = err.errors.map(e => ({
|
|
field: e.path,
|
|
message: e.message
|
|
}));
|
|
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: 'Validation error',
|
|
errors
|
|
});
|
|
}
|
|
|
|
// Sequelize unique constraint errors
|
|
if (err.name === 'SequelizeUniqueConstraintError') {
|
|
return res.status(409).json({
|
|
success: false,
|
|
message: 'Resource already exists',
|
|
field: err.errors[0]?.path
|
|
});
|
|
}
|
|
|
|
// JWT errors
|
|
if (err.name === 'JsonWebTokenError') {
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: 'Invalid token'
|
|
});
|
|
}
|
|
|
|
if (err.name === 'TokenExpiredError') {
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: 'Token expired'
|
|
});
|
|
}
|
|
|
|
// Multer file upload errors
|
|
if (err.name === 'MulterError') {
|
|
if (err.code === 'LIMIT_FILE_SIZE') {
|
|
return res.status(413).json({
|
|
success: false,
|
|
message: 'File too large'
|
|
});
|
|
}
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: err.message
|
|
});
|
|
}
|
|
|
|
// Default error
|
|
const statusCode = err.statusCode || 500;
|
|
const message = err.message || 'Internal server error';
|
|
|
|
res.status(statusCode).json({
|
|
success: false,
|
|
message,
|
|
...(process.env.NODE_ENV === 'development' && { stack: err.stack })
|
|
});
|
|
};
|
|
|
|
module.exports = errorHandler;
|