autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
68 lines (67 loc) • 2 kB
JavaScript
/** 错误处理中间件 */
import { ConflictError, NotFoundError, PermissionDenied, ValidationError, } from '../../shared/errors/index.js';
export function errorHandler(logger) {
return (error, req, res, _next) => {
const status = error.statusCode || error.status || 500;
const code = error.code || 'INTERNAL_ERROR';
const message = error.message || 'Internal server error';
// 记录错误
logger.error('Request error', {
method: req.method,
path: req.path,
status,
code,
message,
error: error.stack,
timestamp: new Date().toISOString(),
});
// 响应错误
res.status(status).json({
success: false,
error: {
code,
message,
details: process.env.NODE_ENV === 'development' ? error.details || {} : undefined,
},
});
};
}
/** 将领域错误转换为 HTTP 错误 */
export function mapDomainError(error) {
if (error instanceof ValidationError) {
return {
status: 400,
code: 'VALIDATION_ERROR',
message: error.message,
details: error.details,
};
}
if (error instanceof ConflictError) {
return {
status: 409,
code: 'CONFLICT_ERROR',
message: error.message,
details: error.details,
};
}
if (error instanceof NotFoundError) {
return {
status: 404,
code: 'NOT_FOUND_ERROR',
message: error.message,
};
}
if (error instanceof PermissionDenied) {
return {
status: 403,
code: 'PERMISSION_DENIED_ERROR',
message: error.message,
};
}
// 默认内部错误
return {
status: 500,
code: 'INTERNAL_ERROR',
message: error.message || 'Internal server error',
};
}