Reference in New Issue
Block a user
Delete Branch "fix/1197-react-error-31"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
Staging 验证 #1197 预览生成时,前端触发 React Error #31: "Objects are not valid as a React child (found: object with keys {})",整个应用崩溃。
根因
useStep3Preview.ts轮询预览任务状态时,直接将data.error_message设为 state:当后端返回的
error_message是对象类型(如{}或{detail: "..."})时,Step3GeneratePreview和PreviewVideoPanel组件将其作为 React child 直接渲染,触发 Error #31。注意:
useGenerationPolling.ts已使用safeExtractError做了防护,但useStep3Preview.ts没有。修复
useStep3Preview.ts — 复用
safeExtractError,封装safeString/safeNumber工具函数:error_message→ 强制转为字符串task_id,video_url→ 强制转为字符串clip_count,duration,file_size等 → 强制转为数字progress→ 强制转为数字safeString处理Step3GeneratePreview.tsx —
previewError增加typeof === "string"守卫PreviewVideoPanel.tsx —
previewError增加typeof === "string"守卫影响范围
pages/generate/下的 3 个文件根因:useStep3Preview 轮询失败时直接将 data.error_message 设为 state, 当后端返回对象类型(如 {} 或 {detail: "..."})时, Step3GeneratePreview / PreviewVideoPanel 将其作为 React child 渲染, 触发 Error #31 "Objects are not valid as a React child"。 修复: 1. useStep3Preview.ts — 复用 safeExtractError 封装 safeString/safeNumber, 确保 error_message、task_id、video_url 等字段始终为字符串, clip_count、duration 等字段始终为数字 2. Step3GeneratePreview.tsx — previewError 增加 typeof 守卫 3. PreviewVideoPanel.tsx — previewError 增加 typeof 守卫🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #1215
⚠️ 问题(1个需要修改)
safeString函数实现存在数据丢失风险safeExtractError。如果传入的val是一个普通字符串(如 API 返回的task_id或video_url),而safeExtractError仅设计用于处理 Error 对象(可能对非 Error 类型返回undefined或空字符串),则会导致有效数据被 fallback 值(空字符串)覆盖。这会导致taskId丢失或videoUrl为空,进而导致功能异常(如无法播放视频、无法追踪任务)。safeString逻辑,优先处理基本类型。例如:💡 建议(2个可选)
useStep3Previewhook 中已经通过safeString确保previewError为字符串类型,组件中的typeof previewError === "string"检查是冗余的,可以直接使用{previewError || "请重试"}(前提是修复了上述问题)。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-08-02 00:22:31 | 模型:
🗑️ 预览环境已清理
PR #1215 已关闭或合并,对应的预览环境已被清理。