本文档引用的文件
AI有声书生成平台的错误处理中间件是整个系统可靠性保障的核心组件。该中间件实现了全局错误捕获机制,通过统一的错误分类、错误包装和错误响应格式化,为平台提供了标准化的错误处理能力。
本中间件采用Koa框架的中间件模式,在应用启动时作为第一个中间件注册,能够捕获所有后续中间件和路由处理器抛出的异常,并将其转换为统一格式的HTTP响应。同时,它还集成了自定义错误类体系,支持不同类型的业务错误场景。
错误处理中间件在项目中的组织结构如下:
graph TB
subgraph "中间件层"
EH["errorHandler.ts<br/>全局错误处理"]
AM["auth.ts<br/>认证中间件"]
UL["usageLimit.ts<br/>使用限制中间件"]
end
subgraph "服务层"
RL["requestLogger.ts<br/>请求日志服务"]
SS["sentry.service.ts<br/>Sentry错误监控"]
LS["log.service.ts<br/>日志分析服务"]
end
subgraph "应用入口"
APP["app.ts<br/>应用启动配置"]
end
APP --> EH
EH --> AM
EH --> UL
EH --> RL
EH --> SS
RL --> LS
图表来源
章节来源
全局错误处理中间件是整个错误处理系统的核心,负责捕获和处理所有未处理的异常。
主要功能特性:
错误响应格式:
{
code: number, // 错误代码
message: string, // 错误消息
data: null // 返回数据(始终为null)
}
章节来源
平台实现了完整的自定义错误类体系,支持不同类型的业务错误场景:
classDiagram
class AppError {
+number code
+number status
+constructor(message, code, status)
}
class UnauthorizedError {
+constructor(message)
}
class ForbiddenError {
+constructor(message)
}
class NotFoundError {
+constructor(message)
}
class BadRequestError {
+constructor(message)
}
class QuotaExceededError {
+constructor(message)
}
AppError <|-- UnauthorizedError
AppError <|-- ForbiddenError
AppError <|-- NotFoundError
AppError <|-- BadRequestError
AppError <|-- QuotaExceededError
图表来源
章节来源
错误处理中间件在整个请求生命周期中的拦截机制如下:
sequenceDiagram
participant Client as 客户端
participant App as 应用
participant EH as 错误处理中间件
participant Auth as 认证中间件
participant Handler as 路由处理器
participant Sentry as Sentry监控
participant Logger as 请求日志
Client->>App : HTTP请求
App->>EH : 进入中间件链
EH->>Auth : 调用下一个中间件
Auth->>Handler : 调用路由处理器
Handler-->>Auth : 正常响应或抛出异常
alt 正常响应
Auth-->>EH : 返回响应
EH-->>Client : 标准化响应
else 异常发生
Auth-->>EH : 抛出错误
EH->>EH : 捕获并处理错误
EH->>Sentry : 发送错误事件
EH->>Logger : 记录错误日志
EH-->>Client : 统一错误响应
end
图表来源
错误处理中间件采用try-catch模式,确保能够捕获所有异步操作中的异常:
flowchart TD
Start([进入中间件]) --> TryNext["调用 next() 执行后续中间件"]
TryNext --> NoError{"是否发生异常?"}
NoError --> |否| ReturnResponse["返回正常响应"]
NoError --> |是| CatchError["捕获异常"]
CatchError --> LogError["记录错误信息"]
LogError --> SetStatus["设置HTTP状态码"]
SetStatus --> FormatResponse["格式化错误响应"]
FormatResponse --> DevEnv{"开发环境?"}
DevEnv --> |是| AddStack["添加堆栈跟踪"]
DevEnv --> |否| SkipStack["跳过堆栈跟踪"]
AddStack --> SendResponse["发送错误响应"]
SkipStack --> SendResponse
SendResponse --> End([结束])
ReturnResponse --> End
图表来源
章节来源
章节来源
认证中间件展示了如何在业务逻辑中抛出自定义错误:
flowchart TD
CheckAuth["检查认证开关"] --> Enabled{"认证启用?"}
Enabled --> |否| SkipAuth["跳过认证"]
Enabled --> |是| CheckHeader["检查Authorization头"]
CheckHeader --> HasHeader{"是否有认证头?"}
HasHeader --> |否| ThrowUnauthorized["抛出UnauthorizedError"]
HasHeader --> |是| ParseToken["解析Token"]
ParseToken --> ValidateToken{"验证Token"}
ValidateToken --> |成功| SetUser["设置用户信息"]
ValidateToken --> |失败| ThrowAuthError["抛出认证错误"]
SetUser --> Next["继续执行"]
ThrowUnauthorized --> ErrorHandler["被全局错误处理中间件捕获"]
ThrowAuthError --> ErrorHandler
SkipAuth --> Next
图表来源
章节来源
使用限制中间件展示了如何结合业务逻辑和错误处理:
章节来源
控制器展示了如何在业务逻辑中抛出适当的错误:
章节来源
Sentry中间件负责将错误事件发送到Sentry进行监控:
章节来源
请求日志中间件负责记录所有请求的详细信息,包括错误请求:
章节来源
日志分析服务提供了错误统计和自动分析功能:
章节来源
错误处理中间件与其他组件的依赖关系如下:
graph TB
subgraph "错误处理核心"
EH["errorHandler.ts"]
AE["AppError"]
UE["UnauthorizedError"]
FE["ForbiddenError"]
NE["NotFoundError"]
BE["BadRequestError"]
QE["QuotaExceededError"]
end
subgraph "业务中间件"
AM["auth.ts"]
UL["usageLimit.ts"]
end
subgraph "监控服务"
SS["sentry.service.ts"]
RL["requestLogger.ts"]
end
subgraph "应用配置"
APP["app.ts"]
end
APP --> EH
EH --> SS
EH --> RL
AM --> AE
AM --> UE
UL --> AE
UL --> FE
UL --> QE
图表来源
章节来源
章节来源
AI有声书生成平台的错误处理中间件通过以下关键特性确保了系统的稳定性和可靠性:
该中间件不仅提高了系统的可维护性,还为开发者提供了清晰的错误处理指导原则。通过合理的错误分类和标准化的响应格式,平台能够为用户提供更好的错误体验,同时为运维团队提供有效的故障诊断工具。
在未来的发展中,可以考虑进一步增强错误处理能力,如添加错误重试机制、实现更精细的错误分类、以及提供更多的错误恢复策略。