本文引用的文件
本文件面向AI有声书生成平台的后端架构,围绕Koa.js应用进行系统化梳理,重点覆盖以下方面:
后端采用模块化与分层架构:
配置层:环境变量加载、模型配置、运行参数
graph TB
subgraph "应用入口"
APP["server/src/app.ts"]
end
subgraph "中间件层"
AUTH["auth.ts"]
SEC["security.ts"]
PERF["performance.ts"]
ERR["errorHandler.ts"]
RATE["rate-limiter.ts"]
end
subgraph "控制器层"
CTRL_AUTH["modules/auth/auth.controller.ts"]
CTRL_TTS["modules/tts/tts.controller.ts"]
end
subgraph "服务层"
SRV_LOGGER["services/logger.service.ts"]
SRV_SENTRY["services/sentry.service.ts"]
SRV_REDIS["services/redis.service.ts"]
SRV_STORAGE["services/storage.service.ts"]
SRV_TTS["modules/tts/tts.service.ts"]
end
subgraph "数据访问层"
PRISMA["models/index.ts"]
end
APP --> AUTH
APP --> SEC
APP --> PERF
APP --> ERR
APP --> RATE
APP --> CTRL_AUTH
APP --> CTRL_TTS
CTRL_AUTH --> SRV_TTS
CTRL_TTS --> SRV_TTS
SRV_TTS --> PRISMA
SRV_TTS --> SRV_STORAGE
SRV_TTS --> SRV_REDIS
SRV_LOGGER --> APP
SRV_SENTRY --> APP
图表来源
章节来源
章节来源
下图展示从客户端到控制器、服务层、存储与数据库的整体交互流程。
sequenceDiagram
participant C as "客户端"
participant K as "Koa应用(app.ts)"
participant M1 as "认证中间件(auth.ts)"
participant M2 as "安全中间件(security.ts)"
participant M3 as "性能中间件(performance.ts)"
participant M4 as "错误处理(errorHandler.ts)"
participant R as "路由(controllers)"
participant S as "服务层(tts.service.ts)"
participant P as "Prisma(models/index.ts)"
participant ST as "存储(storage.service.ts)"
participant RD as "Redis(redis.service.ts)"
C->>K : HTTP请求
K->>M4 : 错误处理
K->>M3 : 性能监控
K->>M2 : 安全过滤
K->>M1 : JWT校验
K->>R : 路由匹配
R->>S : 业务调用
S->>P : 数据库操作
S->>ST : 上传/下载
S->>RD : 缓存读写
S-->>R : 业务结果
R-->>C : 统一响应
图表来源
章节来源
将用户信息注入ctx.state供后续中间件与控制器使用
flowchart TD
Start(["进入认证中间件"]) --> CheckAuth["检查是否开启认证"]
CheckAuth --> |未开启| SetTestUser["设置测试用户信息"]
SetTestUser --> Next["继续下一个中间件"]
CheckAuth --> |已开启| ParseHeader["解析Authorization头"]
ParseHeader --> ValidateFormat{"格式是否为Bearer Token?"}
ValidateFormat --> |否| ThrowUnauthorized["抛出未授权错误"]
ValidateFormat --> |是| VerifyToken["验证JWT签名"]
VerifyToken --> TokenOK{"校验是否通过?"}
TokenOK --> |否| ThrowUnauthorized2["抛出未授权错误"]
TokenOK --> |是| AttachUser["将用户信息写入ctx.state"]
AttachUser --> Next
图表来源
章节来源
安全响应头:X-XSS-Protection、X-Content-Type-Options、X-Frame-Options、CSP
flowchart TD
Start(["进入安全中间件"]) --> SanitizeBody["递归清理请求体XSS"]
SanitizeBody --> SanitizeQuery["递归清理查询参数XSS"]
SanitizeQuery --> SetHeaders["设置安全响应头"]
SetHeaders --> Next["继续下一个中间件"]
图表来源
章节来源
提供通用限流器工厂与多种场景预设(API、登录、短信、TTS、上传)
flowchart TD
Enter(["进入限流中间件"]) --> GetLimiter["获取或创建限流器"]
GetLimiter --> GenKey["生成限流键(默认IP/用户)"]
GenKey --> Consume["尝试consume(1)"]
Consume --> |成功| Next["继续下一个中间件"]
Consume --> |失败| Reject["返回429与Retry-After"]
图表来源
章节来源
提供/health与/api/metrics端点
flowchart TD
Enter(["进入性能监控"]) --> StartTimer["记录开始时间"]
StartTimer --> Next["执行业务逻辑"]
Next --> Calc["计算耗时"]
Calc --> Update["更新全局与端点指标"]
Update --> Slow{"是否慢请求?"}
Slow --> |是| LogWarn["记录慢请求警告"]
Slow --> |否| SetHeader["设置X-Response-Time"]
SetHeader --> Done(["结束"])
图表来源
章节来源
章节来源
数据访问通过Prisma客户端在服务层内完成
classDiagram
class AuthController {
+sendCode()
+login()
+getUserInfo()
+updateUserInfo()
}
class TTSService {
+generateAudio()
+getAudioStatus()
+getAvailableProviders()
}
class PrismaClient {
+$connect()
}
class StorageService {
+uploadAudio()
+downloadFile()
}
class RedisService {
+get/set()
+hgetall()
}
AuthController --> TTSService : "调用"
TTSService --> PrismaClient : "数据访问"
TTSService --> StorageService : "文件上传"
TTSService --> RedisService : "缓存"
图表来源
章节来源
章节来源
章节来源
章节来源
章节来源
章节来源
graph LR
A["app.ts"] --> B["auth.ts"]
A --> C["security.ts"]
A --> D["performance.ts"]
A --> E["errorHandler.ts"]
A --> F["rate-limiter.ts"]
A --> G["auth.controller.ts"]
A --> H["tts.controller.ts"]
H --> I["tts.service.ts"]
I --> J["models/index.ts"]
I --> K["storage.service.ts"]
I --> L["redis.service.ts"]
M["logger.service.ts"] --> A
N["sentry.service.ts"] --> A
图表来源
章节来源
[本节为通用指导,无需特定文件引用]
章节来源
该后端架构以Koa为核心,通过中间件体系实现横切关注点(认证、安全、限流、监控、错误处理),控制器与服务层职责清晰,配合Prisma与统一存储/缓存抽象,满足AI有声书生成平台的高并发与多提供商需求。建议持续完善API版本策略、引入输入校验Schema与统一鉴权装饰器,进一步提升可维护性与安全性。
[本节为总结性内容,无需特定文件引用]
章节来源
章节来源