# 调试技巧 **本文档引用的文件** - [README.md](file://README.md) - [API.md](file://docs/API.md) - [app-troubleshooting.md](file://docs/app-troubleshooting.md) - [debug.ts](file://my-uniapp-vue3/src/utils/debug.ts) - [request.ts](file://my-uniapp-vue3/src/utils/request.ts) - [logger.service.ts](file://server/src/services/logger.service.ts) - [errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [index.ts](file://server/src/services/llm/index.ts) - [tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [video-generator.service.ts](file://server/src/modules/video-generator/video-generator.service.ts) - [ffmpeg.processor.ts](file://server/src/services/ffmpeg.processor.ts) - [langgraph-controller.ts](file://server/src/modules/book-generator/langgraph-controller.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本调试技巧文档面向AI有声书生成平台的前端、后端、数据库、AI服务与媒体处理链路,提供系统化的调试方法论与实操步骤,涵盖: - 前端调试:Vue DevTools、网络请求、性能分析 - 后端调试:Node.js调试器、日志分析、错误追踪 - 数据库调试:查询优化、索引分析、事务调试 - AI服务调试:LangGraph、LLM调用监控、模型输出分析 - 媒体处理调试:FFmpeg参数、音频格式转换、视频生成 - 第三方服务调试:API调用、SDK问题、服务可用性监控 - 常见问题诊断、性能瓶颈分析与生产问题快速定位 ## 项目结构 该平台采用前后端分离架构,前端基于 uniapp + Vue 3 + TypeScript,后端基于 Node.js + Koa,使用 FFmpeg 进行媒体处理,并通过多供应商 TTS 与 LLM 提供 AI 能力。 ```mermaid graph TB subgraph "前端(uniapp)" UI["页面与组件
store/页面/工具"] Utils["工具函数
request.ts/debug.ts"] end subgraph "后端(Node.js/Koa)" API["路由与控制器
langgraph-controller.ts"] Services["业务服务
tts.service.ts
video-generator.service.ts"] LLM["LLM适配层
llm/index.ts"] Media["媒体处理
ffmpeg.processor.ts"] Logger["日志与错误
logger.service.ts
errorHandler.ts"] end subgraph "基础设施" DB["数据库
Prisma/MongoDB"] Storage["对象存储/OSS"] Providers["TTS/LLM提供商"] end UI --> Utils Utils --> API API --> Services Services --> LLM Services --> Media Services --> DB Services --> Storage API --> Logger LLM --> Providers ``` 图表来源 - [README.md:31-52](file://README.md#L31-L52) - [langgraph-controller.ts:1-800](file://server/src/modules/book-generator/langgraph-controller.ts#L1-L800) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [video-generator.service.ts:1-556](file://server/src/modules/video-generator/video-generator.service.ts#L1-L556) - [ffmpeg.processor.ts:1-379](file://server/src/services/ffmpeg.processor.ts#L1-L379) - [logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) 章节来源 - [README.md:18-30](file://README.md#L18-L30) - [API.md:1-499](file://docs/API.md#L1-L499) ## 核心组件 - 前端调试工具:全局调试模块 debug.ts,统一输出页面、参数、API请求/响应、错误日志;请求封装 request.ts,内置重试、缓存、超时与错误处理。 - 后端日志与错误:winston 日志器,HTTP 请求日志;统一错误中间件,抛出自定义 AppError 及其子类。 - AI服务:LLM 适配层,支持原始字符串调用、消息格式调用、工具调用与模型自动切换。 - 媒体处理:FFmpeg 处理器,支持远程文件下载、合并、格式转换、裁剪、音量调整与清理。 - 业务服务:TTS 服务(多供应商)、视频生成服务(含章节关联与进度推送)。 章节来源 - [debug.ts:1-305](file://my-uniapp-vue3/src/utils/debug.ts#L1-L305) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [index.ts:1-362](file://server/src/services/llm/index.ts#L1-L362) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [video-generator.service.ts:1-556](file://server/src/modules/video-generator/video-generator.service.ts#L1-L556) - [ffmpeg.processor.ts:1-379](file://server/src/services/ffmpeg.processor.ts#L1-L379) ## 架构概览 下图展示从前端到后端、AI与媒体处理的关键交互路径,以及日志与错误处理贯穿全链路。 ```mermaid sequenceDiagram participant FE as "前端页面" participant Req as "请求封装
request.ts" participant Ctrl as "控制器
langgraph-controller.ts" participant Svc as "业务服务
tts.service.ts / video-generator.service.ts" participant LLM as "LLM适配
llm/index.ts" participant Media as "FFmpeg处理器
ffmpeg.processor.ts" participant Log as "日志中间件
logger.service.ts" FE->>Req : 发起API请求 Req->>Ctrl : 调用后端路由 Ctrl->>Svc : 触发业务逻辑 Svc->>LLM : LLM调用/工具调用 LLM-->>Svc : 返回文本/工具结果 Svc->>Media : 媒体处理(合并/转换/裁剪) Media-->>Svc : 返回处理结果 Ctrl-->>Req : 统一响应格式 Req-->>FE : 展示结果/错误 Ctrl->>Log : 记录HTTP请求日志 ``` 图表来源 - [request.ts:35-168](file://my-uniapp-vue3/src/utils/request.ts#L35-L168) - [langgraph-controller.ts:383-530](file://server/src/modules/book-generator/langgraph-controller.ts#L383-L530) - [tts.service.ts:285-542](file://server/src/modules/tts/tts.service.ts#L285-L542) - [video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312) - [index.ts:155-201](file://server/src/services/llm/index.ts#L155-L201) - [ffmpeg.processor.ts:69-183](file://server/src/services/ffmpeg.processor.ts#L69-L183) - [logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) ## 详细组件分析 ### 前端调试:Vue DevTools、网络与性能 - 使用全局调试模块: - 页面加载与参数:initDebug() 在 onShow 时输出页面路径与参数,便于定位页面切换与参数传递问题。 - API 请求/响应/错误:request.ts 调用 debugApiRequest/debugApiResponse/debugApiError,统一输出方法、URL、状态、耗时与页面上下文。 - 全局错误捕获:initGlobalErrorHandler() 捕获未处理 Promise 与运行时错误,结合 uni.onError 输出堆栈信息。 - 性能分析: - 在 request.ts 中记录请求开始/结束时间,计算耗时,辅助识别慢接口。 - 使用浏览器/开发者工具的性能面板观察主线程阻塞、重绘与 GC。 - App 端兼容性: - 遵循 app-troubleshooting.md 的条件编译与替代方案,避免直接使用 H5 特有 API。 ```mermaid flowchart TD Start(["页面初始化"]) --> InitDebug["initDebug()
注册页面/导航拦截器"] InitDebug --> PageShow["onShow()
输出页面路径与参数"] PageShow --> Request["发起请求 request()"] Request --> DebugReq["debugApiRequest()
记录请求"] Request --> Resp{"响应成功?"} Resp --> |是| DebugResp["debugApiResponse()
记录状态/耗时/数据"] Resp --> |否| DebugErr["debugApiError()
记录错误/耗时"] DebugResp --> End(["完成"]) DebugErr --> End ``` 图表来源 - [debug.ts:194-278](file://my-uniapp-vue3/src/utils/debug.ts#L194-L278) - [request.ts:102-168](file://my-uniapp-vue3/src/utils/request.ts#L102-L168) 章节来源 - [debug.ts:1-305](file://my-uniapp-vue3/src/utils/debug.ts#L1-L305) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [app-troubleshooting.md:1-201](file://docs/app-troubleshooting.md#L1-L201) ### 后端调试:Node.js、日志与错误 - Node.js 调试器: - 使用 --inspect/--inspect-brk 启动,配合 VS Code/Chrome DevTools 断点调试。 - 在关键业务入口(如 langgraph-controller.ts)设置断点,观察上下文、参数与分支逻辑。 - 日志分析: - winston 日志器输出到控制台与文件,区分 info/error/http 等级别;httpLogger 记录请求方法、URL、状态、耗时与 UA/IP。 - 关注 error.log 与 http.log,结合业务日志定位问题根因。 - 错误追踪: - errorHandler 中间件统一捕获异常,返回 code/status,并在开发环境输出 stack。 - 自定义 AppError/UnauthorizedError/ForbiddenError/NotFoundError/BadRequestError/QuotaExceededError,便于前端识别与提示。 ```mermaid sequenceDiagram participant C as "客户端" participant M as "中间件
errorHandler.ts" participant L as "日志
logger.service.ts" participant S as "业务逻辑" C->>M : 发起请求 M->>S : 调用业务 S-->>M : 抛出异常 M-->>C : 统一错误响应(code,status) M->>L : 记录错误日志(stack,meta) ``` 图表来源 - [errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24) - [logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) 章节来源 - [logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ### 数据库调试:查询优化、索引与事务 - 查询优化: - 使用 Prisma/数据库客户端进行 EXPLAIN/EXPLAIN ANALYZE,关注全表扫描、缺失索引与 N+1 查询。 - 对高频查询字段建立复合索引,如用户ID+状态、书ID+章节号等。 - 索引分析: - 通过慢查询日志与性能剖析工具识别低效 SQL,针对性补充索引。 - 事务调试: - 对跨表写入(如生成音频后更新章节与记录)使用事务包裹,失败时回滚。 - 在并发场景下使用悲观锁/乐观锁,避免脏写与丢失更新。 [本节为通用指导,不直接分析具体文件] ### AI服务调试:LangGraph、LLM调用与模型输出 - LangGraph 调试: - 在 langgraph-controller.ts 中观察书籍创建流程:预估规模、配额检查、队列/同步模式、状态更新与错误回退。 - 关键断点:生成前配额检查、队列加入/降级、生成完成/失败状态回写。 - LLM 调用监控: - index.ts 提供 callLLM/callLLMWithMessages/callLLMWithTools,均记录请求/响应日志与模型切换。 - 使用 getToolCapableModel/getNextToolCapableModel 自动切换可用模型,避免单点故障。 - 模型输出分析: - 在 LLM 适配层打印消息摘要与响应片段,结合业务校验(如 JSON 解析、关键词匹配)进行降级处理。 ```mermaid sequenceDiagram participant Ctrl as "控制器
langgraph-controller.ts" participant LLM as "LLM适配
llm/index.ts" participant Svc as "业务服务
tts.service.ts" participant DB as "数据库" Ctrl->>LLM : callLLMWithMessages(书籍类型/难度推荐) LLM-->>Ctrl : 返回JSON/文本 Ctrl->>Svc : 触发生成(队列/同步) Svc->>DB : 更新书籍/章节状态 Svc-->>Ctrl : 返回生成结果 ``` 图表来源 - [langgraph-controller.ts:383-530](file://server/src/modules/book-generator/langgraph-controller.ts#L383-L530) - [index.ts:155-201](file://server/src/services/llm/index.ts#L155-L201) - [tts.service.ts:285-542](file://server/src/modules/tts/tts.service.ts#L285-L542) 章节来源 - [langgraph-controller.ts:1-800](file://server/src/modules/book-generator/langgraph-controller.ts#L1-L800) - [index.ts:1-362](file://server/src/services/llm/index.ts#L1-L362) ### 媒体处理调试:FFmpeg参数、音频格式与视频生成 - FFmpeg 参数调试: - 使用 ffmpeg.processor.ts 的下载、合并、格式转换、裁剪、音量调整等方法,逐步验证命令参数与超时设置。 - 通过日志输出确认下载完成、合并成功、上传完成与清理临时文件。 - 音频格式转换: - convertFormat 支持 mp3/wav/aac,可调整比特率;结合 getDuration 获取时长验证质量。 - 视频生成: - video-generator.service.ts 从章节音频与图片生成视频,支持带/不带背景音乐;失败时更新项目状态并推送 WebSocket 事件。 ```mermaid flowchart TD A["输入URL数组"] --> D["downloadFile()
远程下载到本地"] D --> L["生成文件列表list.txt"] L --> M["ffmpeg 合并音频"] M --> U["上传到存储"] U --> R["返回最终URL"] D -.-> C["cleanupTempFiles()
清理临时文件"] M -.-> C U -.-> C ``` 图表来源 - [ffmpeg.processor.ts:69-122](file://server/src/services/ffmpeg.processor.ts#L69-L122) 章节来源 - [ffmpeg.processor.ts:1-379](file://server/src/services/ffmpeg.processor.ts#L1-L379) - [video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312) ### 第三方服务调试:API调用、SDK与可用性监控 - API 调用调试: - 使用 request.ts 的统一请求封装,开启 showLoading、配置 retry/cache/timeout,结合 debugApiRequest/debugApiResponse 定位问题。 - 参考 API.md 的接口规范,核对请求/响应格式与错误码。 - SDK 使用问题: - TTS 服务支持阿里云、MiniMax、Mock 多供应商,若出现额度限制或网络异常,自动切换下一个供应商。 - 服务可用性监控: - 通过日志与错误中间件记录异常,结合健康检查接口与告警策略,快速发现服务不可用。 章节来源 - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [API.md:1-499](file://docs/API.md#L1-L499) - [tts.service.ts:163-190](file://server/src/modules/tts/tts.service.ts#L163-L190) ## 依赖分析 - 前端依赖后端接口与统一响应格式;请求封装依赖调试模块输出日志。 - 后端控制器依赖业务服务;业务服务依赖 LLM 与媒体处理;日志中间件贯穿请求生命周期。 - LLM 适配层依赖配置中心与模型列表,具备自动模型切换能力。 - 媒体处理依赖 FFmpeg 与存储服务,具备远程下载与上传能力。 ```mermaid graph LR FE["前端
request.ts/debug.ts"] --> API["后端路由
langgraph-controller.ts"] API --> SVC["业务服务
tts.service.ts
video-generator.service.ts"] SVC --> LLM["LLM适配
llm/index.ts"] SVC --> MEDIA["FFmpeg处理器
ffmpeg.processor.ts"] API --> LOG["日志中间件
logger.service.ts"] API --> ERR["错误中间件
errorHandler.ts"] ``` 图表来源 - [request.ts:35-168](file://my-uniapp-vue3/src/utils/request.ts#L35-L168) - [langgraph-controller.ts:383-530](file://server/src/modules/book-generator/langgraph-controller.ts#L383-L530) - [tts.service.ts:285-542](file://server/src/modules/tts/tts.service.ts#L285-L542) - [video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312) - [index.ts:155-201](file://server/src/services/llm/index.ts#L155-L201) - [ffmpeg.processor.ts:69-183](file://server/src/services/ffmpeg.processor.ts#L69-L183) - [logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) - [errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24) ## 性能考虑 - 前端: - 合理使用缓存(GET 请求缓存)、减少不必要的重渲染、拆分大组件。 - 后端: - 使用连接池、批量写入、异步处理(队列/WebSocket)降低阻塞;对热点接口进行限流与熔断。 - 媒体处理: - 控制并发与超时,合理设置 FFmpeg 参数与比特率;及时清理临时文件。 - AI 服务: - 优先使用支持工具调用的模型,必要时自动切换;对长文本分段处理,避免超时。 [本节为通用指导,不直接分析具体文件] ## 故障排查指南 - 常见问题诊断: - App 白屏/正则报错:marked 包版本问题,降级至旧版本。 - App 端 window/document/localStorage 兼容性:使用条件编译或替代方案。 - JSON 循环引用导致崩溃:避免对页面对象直接序列化。 - CSS gap 不兼容:改用 margin 替代。 - Android 手机网络请求无反应:检查平台判断与 API 地址拼接。 - 生产问题快速定位: - 查看 error.log/http.log,结合业务日志定位异常堆栈与请求上下文。 - 使用统一错误响应 code/status,前端据此提示与重试。 - 对 TTS/视频生成等耗时任务,通过状态轮询与 WebSocket 推送实时反馈。 章节来源 - [app-troubleshooting.md:1-201](file://docs/app-troubleshooting.md#L1-L201) - [logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ## 结论 通过统一的日志与错误处理、完善的前端调试工具、可切换的 AI 与媒体处理链路,以及针对 App 端的兼容性与性能优化,本平台能够高效定位与解决各类问题。建议在开发与生产环境中持续完善监控与告警,形成闭环的调试与运维体系。 [本节为总结,不直接分析具体文件] ## 附录 - API 接口参考:详见 API.md,涵盖认证、TTS、音频、会员、分享等模块的请求/响应规范与错误码。 - 快速启动与环境:参考 README.md 的技术栈与启动说明,确保 Node.js、数据库与 FFmpeg 环境正确配置。 章节来源 - [API.md:1-499](file://docs/API.md#L1-L499) - [README.md:54-90](file://README.md#L54-L90)