# 中间件扩展 **本文引用的文件** - [server/src/app.ts](file://server/src/app.ts) - [server/src/middleware/auth.ts](file://server/src/middleware/auth.ts) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/middleware/cache.ts](file://server/src/middleware/cache.ts) - [server/src/middleware/security.ts](file://server/src/middleware/security.ts) - [server/src/middleware/rate-limiter.ts](file://server/src/middleware/rate-limiter.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/services/redis.service.ts](file://server/src/services/redis.service.ts) - [server/src/modules/auth/auth.controller.ts](file://server/src/modules/auth/auth.controller.ts) - [server/src/modules/tts/tts.controller.ts](file://server/src/modules/tts/tts.controller.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) - [server/src/config/index.ts](file://server/src/config/index.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向AI有声书生成平台的中间件扩展与实践,围绕认证、错误处理、缓存、安全与限流等关键中间件,系统阐述其执行顺序、上下文传递、异常处理机制,并提供自定义中间件开发模板、配置管理、性能优化、链路设计、调试与监控、测试策略与部署注意事项。目标是帮助开发者在保持现有中间件体系稳定的同时,安全地扩展新的中间件能力。 ## 项目结构 中间件位于 server/src/middleware 目录,应用入口 server/src/app.ts 统一注册中间件;各业务模块通过路由控制器使用中间件。Redis 服务封装于 server/src/services/redis.service.ts,供缓存与限流等中间件使用。 ```mermaid graph TB A["应用入口
server/src/app.ts"] --> B["错误处理中间件
server/src/middleware/errorHandler.ts"] A --> C["性能监控中间件
server/src/middleware/performance.ts"] A --> D["日志中间件
server/src/services/logger.service.ts"] A --> E["安全中间件XSS/SQL注入
server/src/middleware/security.ts"] A --> F["CORS 中间件
@koa/cors"] A --> G["请求体解析
koa-body/bodyparser"] A --> H["静态文件挂载
koa-mount/serve"] subgraph "业务路由" R1["认证路由
server/src/modules/auth/auth.controller.ts"] R2["TTS 路由
server/src/modules/tts/tts.controller.ts"] end A --> R1 A --> R2 subgraph "服务层" S1["Redis 服务
server/src/services/redis.service.ts"] end B -. 使用 .-> S1 C -. 使用 .-> S1 E -. 使用 .-> S1 ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/services/redis.service.ts:1-274](file://server/src/services/redis.service.ts#L1-L274) - [server/src/modules/auth/auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94) - [server/src/modules/tts/tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) ## 核心组件 - 认证中间件:提供强制认证与可选认证两种模式,基于 JWT 校验,将用户信息写入 ctx.state.user。 - 错误处理中间件:统一捕获异常,输出结构化错误响应,并在开发环境输出堆栈。 - 缓存中间件:基于 Redis 的响应缓存与键空间清理,支持自定义键生成器与 TTL。 - 安全中间件:XSS 过滤、SQL 注入检测、敏感数据脱敏与安全响应头设置。 - 限流中间件:基于 rate-limiter-flexible 的内存/Redis 限流器,支持多场景限流策略。 - 性能监控中间件:统计总请求数、平均响应时间、慢请求、错误率与端点级指标。 - 使用配额中间件:按会员等级校验每日使用次数与字数配额,写入 ctx.state.userQuota 与 ctx.state.userInfo。 章节来源 - [server/src/middleware/auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/src/middleware/cache.ts:1-98](file://server/src/middleware/cache.ts#L1-L98) - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/rate-limiter.ts:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) ## 架构总览 中间件在应用启动时按顺序注册,形成“洋葱模型”调用链。每个中间件在 next() 前后可进行前置处理与后置处理,异常在错误处理中间件集中捕获。 ```mermaid sequenceDiagram participant Client as "客户端" participant App as "Koa 应用
server/src/app.ts" participant EH as "错误处理中间件" participant PM as "性能监控中间件" participant SEC as "安全中间件" participant RL as "限流中间件" participant AUTH as "认证中间件" participant USAGE as "使用配额中间件" participant CTRL as "业务控制器" Client->>App : HTTP 请求 App->>EH : 进入错误处理 EH->>PM : 调用 next() PM->>SEC : 调用 next() SEC->>RL : 调用 next() RL->>AUTH : 调用 next() AUTH->>USAGE : 调用 next() USAGE->>CTRL : 调用 next() CTRL-->>USAGE : 返回响应或抛错 USAGE-->>AUTH : 返回响应或抛错 AUTH-->>RL : 返回响应或抛错 RL-->>SEC : 返回响应或抛错 SEC-->>PM : 返回响应或抛错 PM-->>EH : 返回响应或抛错 EH-->>Client : 结构化响应 ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/middleware/errorHandler.ts:1-24](file://server/src/middleware/errorHandler.ts#L1-L24) - [server/src/middleware/performance.ts:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/middleware/usageLimit.ts:6-49](file://server/src/middleware/usageLimit.ts#L6-L49) ## 详细组件分析 ### 认证中间件 - 强制认证:读取 Authorization Bearer Token,校验签名与过期,失败抛出未授权错误;开发模式可通过环境变量跳过。 - 可选认证:允许未登录访问,若携带无效 Token 则回退为测试用户,便于联调。 - 上下文传递:将用户信息写入 ctx.state.user,后续中间件与控制器可读取。 ```mermaid flowchart TD Start(["进入认证中间件"]) --> CheckDev{"开发模式且禁用认证?"} CheckDev --> |是| UseTestUser["写入测试用户到 ctx.state.user"] --> Next1["调用 next()"] CheckDev --> |否| GetHeader["读取 Authorization 头"] GetHeader --> HasHeader{"存在且格式正确?"} HasHeader --> |否| ThrowUnauthorized["抛出未授权错误"] --> End HasHeader --> |是| Verify["校验 JWT 签名与有效期"] Verify --> OK{"校验通过?"} OK --> |否| ThrowAuthFail["抛出认证失败/过期/无效"] --> End OK --> |是| SetUser["写入用户信息到 ctx.state.user"] --> Next2["调用 next()"] --> End ``` 图表来源 - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/middleware/auth.ts:52-80](file://server/src/middleware/auth.ts#L52-L80) 章节来源 - [server/src/middleware/auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81) - [server/src/types/index.ts:66-82](file://server/src/types/index.ts#L66-L82) ### 错误处理中间件 - 统一捕获异常,设置状态码与结构化响应体;开发环境附加堆栈信息。 - 提供多种业务错误类(未授权、禁止、资源不存在、请求错误、配额超限)以表达不同语义。 ```mermaid flowchart TD Enter(["进入错误处理中间件"]) --> TryNext["尝试执行下游中间件/控制器"] TryNext --> Catch{"是否抛出异常?"} Catch --> |否| ReturnResp["返回正常响应"] Catch --> |是| BuildResp["构造错误响应体
状态码/错误码/消息"] BuildResp --> DevEnv{"开发环境?"} DevEnv --> |是| AddStack["附加堆栈信息"] --> Send DevEnv --> |否| Send["发送错误响应"] ReturnResp --> End Send --> End ``` 图表来源 - [server/src/middleware/errorHandler.ts:1-24](file://server/src/middleware/errorHandler.ts#L1-L24) - [server/src/middleware/errorHandler.ts:26-67](file://server/src/middleware/errorHandler.ts#L26-L67) 章节来源 - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ### 缓存中间件 - 基于 Redis 的响应缓存:命中则直接返回缓存并设置 X-Cache 头;未命中执行下游逻辑并将成功响应缓存。 - 键生成策略:支持自定义 keyGenerator 与 keyPrefix,默认使用 method:url。 - 清理缓存:提供按前缀批量删除能力,便于灰度与维护。 ```mermaid flowchart TD Enter(["进入缓存中间件"]) --> RedisOK{"Redis 可用?"} RedisOK --> |否| Next["跳过缓存,直接调用 next()"] --> End RedisOK --> |是| GenKey["生成缓存键支持自定义"] GenKey --> GetCache["从 Redis 读取缓存"] GetCache --> Hit{"命中?"} Hit --> |是| SetHeaderHit["设置 X-Cache: HIT"] --> ReturnCache["返回缓存内容"] --> End Hit --> |否| Exec["调用 next() 执行下游"] Exec --> StatusOK{"状态码为 200 且有 body?"} StatusOK --> |否| End StatusOK --> |是| SetHeaderMiss["设置 X-Cache: MISS"] --> SaveCache["写入 Redis带 TTL"] --> End ``` 图表来源 - [server/src/middleware/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) - [server/src/middleware/cache.ts:54-61](file://server/src/middleware/cache.ts#L54-L61) - [server/src/services/redis.service.ts:43-82](file://server/src/services/redis.service.ts#L43-L82) 章节来源 - [server/src/middleware/cache.ts:1-98](file://server/src/middleware/cache.ts#L1-L98) - [server/src/services/redis.service.ts:1-274](file://server/src/services/redis.service.ts#L1-L274) ### 安全中间件 - XSS 防护:递归过滤请求体与查询参数中的危险字符与脚本标签,设置安全响应头。 - SQL 注入防护:对查询参数与请求体进行模式匹配检测,发现非法字符直接返回错误。 - 敏感数据脱敏:对响应体中密码、令牌等字段进行脱敏处理。 ```mermaid flowchart TD Enter(["进入安全中间件"]) --> XSS["递归过滤请求体/查询参数中的 XSS"] XSS --> SetHeaders["设置安全响应头"] SetHeaders --> Next["调用 next()"] Next --> PostFilter{"是否需要脱敏响应?"} PostFilter --> |是| Mask["递归脱敏敏感字段"] --> End PostFilter --> |否| End ``` 图表来源 - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/security.ts:61-84](file://server/src/middleware/security.ts#L61-L84) - [server/src/middleware/security.ts:105-133](file://server/src/middleware/security.ts#L105-L133) 章节来源 - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) ### 限流中间件 - 支持内存与 Redis 两套限流器,Redis 不可用时自动降级。 - 提供通用 createRateLimiter 与多个场景化限流器(API 全局、登录、短信、TTS、上传)。 - 限流触发时设置 Retry-After 并返回 429。 ```mermaid flowchart TD Enter(["进入限流中间件"]) --> GetLimiter["获取/创建限流器Redis/内存"] GetLimiter --> GenKey["生成限流键IP/用户/手机号等"] GenKey --> Consume["尝试消费 1 个配额"] Consume --> OK{"是否允许?"} OK --> |是| Next["调用 next()"] --> End OK --> |否| Reject["设置 Retry-After 与 429 响应"] --> End ``` 图表来源 - [server/src/middleware/rate-limiter.ts:18-72](file://server/src/middleware/rate-limiter.ts#L18-L72) - [server/src/middleware/rate-limiter.ts:77-120](file://server/src/middleware/rate-limiter.ts#L77-L120) 章节来源 - [server/src/middleware/rate-limiter.ts:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) ### 性能监控中间件 - 统计总请求数、平均响应时间、慢请求(阈值 1 秒)、错误率与端点级指标。 - 在响应头中附加 X-Response-Time,便于前端与网关侧观测。 - 提供指标查询路由与重置能力。 ```mermaid flowchart TD Enter(["进入性能监控中间件"]) --> Start["记录开始时间"] Start --> Next["调用 next()"] Next --> Done{"执行成功?"} Done --> |是| Calc["计算耗时并更新全局与端点指标"] --> Slow{"是否慢请求?"} Slow --> |是| Warn["记录慢请求警告"] --> SetHeader["设置 X-Response-Time"] --> End Slow --> |否| SetHeader --> End Done --> |否| IncErr["增加错误计数"] --> Throw["向上抛出异常"] --> End ``` 图表来源 - [server/src/middleware/performance.ts:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/middleware/performance.ts:81-110](file://server/src/middleware/performance.ts#L81-L110) 章节来源 - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) ### 使用配额中间件 - 对未登录用户写入无限制配额;对已登录用户按会员等级检查每日使用次数与字数配额。 - 将用户配额与用户信息写入 ctx.state,供后续中间件与控制器使用。 ```mermaid flowchart TD Enter(["进入使用配额中间件"]) --> CheckUser{"是否存在用户ID?"} CheckUser --> |否| SetUnlimited["写入无限制配额到 ctx.state.userQuota"] --> Next["调用 next()"] --> End CheckUser --> |是| LoadUser["查询用户并校验存在性"] LoadUser --> ResetDaily{"是否跨日?"} ResetDaily --> |是| UpdateDaily["重置每日使用次数"] --> CheckQuota["按会员等级获取配额"] ResetDaily --> |否| CheckQuota CheckQuota --> DailyOK{"是否超过每日次数?"} DailyOK --> |是| ThrowDaily["抛出配额超限错误"] --> End DailyOK --> |否| WriteState["写入 ctx.state.userQuota 与 ctx.state.userInfo"] --> Next --> End ``` 图表来源 - [server/src/middleware/usageLimit.ts:6-49](file://server/src/middleware/usageLimit.ts#L6-L49) 章节来源 - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/types/index.ts:115-124](file://server/src/types/index.ts#L115-L124) ## 依赖关系分析 - 中间件之间通过 Koa 的 next() 串联,形成明确的前后置处理边界。 - 错误处理中间件作为最外层,统一兜底异常。 - 安全中间件在认证之前,确保输入与响应均经过净化与保护。 - 限流与配额中间件在认证之后,利用 ctx.state.user 进行精细化控制。 - 缓存中间件通常置于限流/认证之后,避免缓存污染。 - Redis 服务被缓存与限流中间件共享,需保证连接可用性与稳定性。 ```mermaid graph LR EH["错误处理"] --> PM["性能监控"] PM --> SEC["安全中间件"] SEC --> RL["限流中间件"] RL --> AUTH["认证中间件"] AUTH --> USAGE["使用配额中间件"] USAGE --> CTRL["业务控制器"] EH -.-> REDIS["Redis 服务"] PM -.-> REDIS RL -.-> REDIS CACHE["缓存中间件"] -.-> REDIS ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/middleware/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) - [server/src/middleware/rate-limiter.ts:18-43](file://server/src/middleware/rate-limiter.ts#L18-L43) - [server/src/services/redis.service.ts:43-82](file://server/src/services/redis.service.ts#L43-L82) 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) ## 性能考量 - 缓存命中优先:合理设置 TTL 与键生成策略,避免热点键竞争与雪崩。 - 限流降级:Redis 不可用时自动切换内存限流器,保障服务可用性。 - 响应头可观测:X-Response-Time 与 X-Cache 头便于前端与网关侧监控。 - 慢请求告警:慢请求计数与端点级指标可用于定位瓶颈。 - 配额控制:结合会员等级与字数限制,避免单用户过度占用资源。 ## 故障排查指南 - 认证失败:检查 Authorization 头格式与 Token 有效性;开发模式确认 AUTH_ENABLED 配置。 - 缓存异常:确认 Redis 连接状态与键空间权限;观察 X-Cache 头判断命中/未命中。 - 限流触发:查看 Retry-After 响应头与限流键(IP/用户/手机号),调整策略或白名单。 - 安全拦截:关注 SQL 注入检测规则与 XSS 过滤结果,必要时放宽或定制规则。 - 错误响应:生产环境查看结构化错误体,开发环境查看堆栈信息定位问题。 章节来源 - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/middleware/cache.ts:42-46](file://server/src/middleware/cache.ts#L42-L46) - [server/src/middleware/rate-limiter.ts:60-71](file://server/src/middleware/rate-limiter.ts#L60-L71) - [server/src/middleware/security.ts:69-83](file://server/src/middleware/security.ts#L69-L83) - [server/src/middleware/errorHandler.ts:9-23](file://server/src/middleware/errorHandler.ts#L9-L23) ## 结论 该中间件体系以“洋葱模型”清晰划分职责边界,通过统一的错误处理、安全防护、性能监控与缓存/限流机制,保障了平台在高并发与复杂业务场景下的稳定性与可运维性。扩展新中间件时,应遵循现有顺序与上下文约定,确保异常可兜底、性能可观测、配置可治理。 ## 附录 ### 中间件执行顺序与最佳实践 - 推荐顺序:错误处理 → Sentry → 性能监控 → 日志 → 安全 → CORS → 请求体解析 → 静态文件 → 限流 → 认证 → 使用配额 → 业务控制器。 - 上下文传递:仅在 ctx.state 中存放必要信息,避免污染请求体与响应体。 - 异常处理:优先使用业务错误类,便于统一处理与前端提示。 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) ### 自定义中间件开发模板(步骤) - 定义函数签名:接收 ctx 与 next,返回 Promise。 - 前置处理:读取请求上下文,进行参数校验或预处理。 - 调用 next:等待下游执行。 - 后置处理:根据 ctx 状态设置响应头或进行日志记录。 - 异常捕获:在中间件内捕获并抛出业务错误类,交由错误处理中间件统一输出。 章节来源 - [server/src/middleware/errorHandler.ts:26-67](file://server/src/middleware/errorHandler.ts#L26-L67) ### 配置管理要点 - 认证:开发模式可通过环境变量控制是否启用强制认证。 - JWT:密钥需与签发端一致,避免跨环境不一致导致的认证失败。 - Redis:连接参数与可用性直接影响缓存与限流功能。 - 模型与供应商:统一在配置中心管理,便于动态切换与灰度发布。 章节来源 - [server/src/middleware/auth.ts:8-18](file://server/src/middleware/auth.ts#L8-L18) - [server/src/config/index.ts:77-81](file://server/src/config/index.ts#L77-L81) - [server/src/services/redis.service.ts:7-38](file://server/src/services/redis.service.ts#L7-L38) ### 性能优化技巧 - 缓存:热点接口开启缓存,合理设置 TTL;对幂等读接口优先走缓存。 - 限流:区分不同场景与用户身份,避免一刀切导致的误伤。 - 监控:结合慢请求与端点指标,定位性能瓶颈;定期清理慢请求日志。 - 配额:按会员等级差异化配额,提升付费转化与资源利用率。 章节来源 - [server/src/middleware/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/performance.ts:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/middleware/usageLimit.ts:6-49](file://server/src/middleware/usageLimit.ts#L6-L49) ### 调试方法与监控指标 - 调试:开启开发环境日志与堆栈输出;使用 X-Response-Time 与 X-Cache 头辅助定位。 - 指标:总请求数、平均响应时间、慢请求、错误率、端点级指标与错误率百分比。 - 路由:/api/metrics 提供当前指标快照,可用于仪表盘展示。 章节来源 - [server/src/middleware/performance.ts:81-110](file://server/src/middleware/performance.ts#L81-L110) - [server/src/app.ts:96-98](file://server/src/app.ts#L96-L98) ### 测试策略与部署注意事项 - 单元测试:针对中间件的前置/后置逻辑与异常分支编写用例。 - 集成测试:模拟真实请求链路,覆盖认证、缓存、限流与安全场景。 - 部署:确保 Redis 服务可用;生产环境关闭开发模式认证豁免;按需开启全局限流中间件。 - 回滚:限流与缓存变更需具备快速回滚策略,避免影响线上流量。 章节来源 - [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192) - [server/src/services/redis.service.ts:246-255](file://server/src/services/redis.service.ts#L246-L255) ### 使用示例参考 - 认证路由:在控制器中使用认证中间件保护用户信息接口。 - 可选认证:TTS 生成接口使用可选认证,便于未登录用户预览体验。 - 使用配额:在控制器中读取 ctx.state.userQuota 与 ctx.state.userInfo 进行业务校验。 章节来源 - [server/src/modules/auth/auth.controller.ts:54-64](file://server/src/modules/auth/auth.controller.ts#L54-L64) - [server/src/modules/tts/tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127) - [server/src/middleware/usageLimit.ts:44-49](file://server/src/middleware/usageLimit.ts#L44-L49)