Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
import { logger } from '../utils/logger.js';
|
|
|
|
export const errorHandler = (err, req, res, next) => {
|
|
// Log error
|
|
logger.error('Error occurred:', {
|
|
error: err.message,
|
|
stack: err.stack,
|
|
url: req.url,
|
|
method: req.method,
|
|
body: req.body,
|
|
params: req.params,
|
|
query: req.query
|
|
});
|
|
|
|
// Mongoose validation error
|
|
if (err.name === 'ValidationError') {
|
|
const errors = Object.values(err.errors).map(e => e.message);
|
|
return res.status(400).json({
|
|
error: 'Validation failed',
|
|
details: errors
|
|
});
|
|
}
|
|
|
|
// Mongoose duplicate key error
|
|
if (err.code === 11000) {
|
|
const field = Object.keys(err.keyPattern)[0];
|
|
return res.status(400).json({
|
|
error: 'Duplicate value',
|
|
field,
|
|
message: `${field} already exists`
|
|
});
|
|
}
|
|
|
|
// Mongoose cast error
|
|
if (err.name === 'CastError') {
|
|
return res.status(400).json({
|
|
error: 'Invalid ID format',
|
|
field: err.path,
|
|
value: err.value
|
|
});
|
|
}
|
|
|
|
// JWT errors
|
|
if (err.name === 'JsonWebTokenError') {
|
|
return res.status(401).json({
|
|
error: 'Invalid token'
|
|
});
|
|
}
|
|
|
|
if (err.name === 'TokenExpiredError') {
|
|
return res.status(401).json({
|
|
error: 'Token expired'
|
|
});
|
|
}
|
|
|
|
// Custom business logic errors
|
|
if (err.message.includes('not found')) {
|
|
return res.status(404).json({
|
|
error: err.message
|
|
});
|
|
}
|
|
|
|
if (err.message.includes('already exists')) {
|
|
return res.status(409).json({
|
|
error: err.message
|
|
});
|
|
}
|
|
|
|
if (err.message.includes('Cannot') || err.message.includes('Invalid')) {
|
|
return res.status(400).json({
|
|
error: err.message
|
|
});
|
|
}
|
|
|
|
// Default error
|
|
res.status(err.status || 500).json({
|
|
error: err.message || 'Internal server error',
|
|
...(process.env.NODE_ENV === 'development' && { stack: err.stack })
|
|
});
|
|
}; |