From 84fea979c42328559815f6973b9be38a19100140 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 18 Jul 2026 17:18:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(P0):=20=E5=85=A8=E9=9D=A2=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=90=8E=E7=99=BD=E5=B1=8F=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=20-=204=E4=B8=AA=E9=A1=B5=E9=9D=A2=E5=8A=A0=E9=98=B2=E5=BE=A1?= =?UTF-8?q?=E6=80=A7=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AssetLibrary: operationResult.succeeded/failed 加可选链+空值合并, 防止后端返回字段缺失时 .length 访问undefined崩溃 - ProductLibrary: products 加 Array.isArray 防御,API层返回数组校验 - GenerationHistoryModal: history 加可选链+空数组兜底 - 统一风格:API层归一化 + 组件层防御 双层保险 --- apps/web/src/api/products.ts | 7 ++++++- apps/web/src/pages/assets/AssetLibrary.tsx | 8 ++++---- .../editing-planner/components/GenerationHistoryModal.tsx | 4 ++-- apps/web/src/pages/products/ProductLibrary.tsx | 7 +++++-- 4 files changed, 17 insertions(+), 9 deletions(-) mode change 100644 => 100755 apps/web/src/api/products.ts mode change 100644 => 100755 apps/web/src/pages/products/ProductLibrary.tsx diff --git a/apps/web/src/api/products.ts b/apps/web/src/api/products.ts old mode 100644 new mode 100755 index 539ef3132..4188092f2 --- a/apps/web/src/api/products.ts +++ b/apps/web/src/api/products.ts @@ -89,7 +89,12 @@ export const getProducts = async ( params?: ProductListParams, ): Promise => { const response = await apiClient.get("/generation/tasks", { params }); - const tasks = response.data.items || response.data || []; + const data = response.data; + const tasks = Array.isArray(data?.items) + ? data.items + : Array.isArray(data) + ? data + : []; return tasks.map(mapTaskToProductItem); }; diff --git a/apps/web/src/pages/assets/AssetLibrary.tsx b/apps/web/src/pages/assets/AssetLibrary.tsx index 35555cd9d..23ecd166c 100755 --- a/apps/web/src/pages/assets/AssetLibrary.tsx +++ b/apps/web/src/pages/assets/AssetLibrary.tsx @@ -1277,13 +1277,13 @@ const AssetLibrary: React.FC = () => { )} - {operationResult.succeeded.length > 0 && ( + {(operationResult?.succeeded?.length ?? 0) > 0 && (

成功列表

- {operationResult.succeeded.map((id) => ( + {operationResult?.succeeded?.map((id) => (
{id}
@@ -1292,13 +1292,13 @@ const AssetLibrary: React.FC = () => {
)} - {operationResult.failed.length > 0 && ( + {(operationResult?.failed?.length ?? 0) > 0 && (

失败列表

- {operationResult.failed.map((id) => ( + {operationResult?.failed?.map((id) => (
{id}
diff --git a/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx b/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx index 7c4ce926f..b9019decf 100755 --- a/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx +++ b/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx @@ -48,7 +48,7 @@ const GenerationHistoryModal: React.FC = ({
- ) : history.length === 0 ? ( + ) : (history?.length ?? 0) === 0 ? (
暂无生成记录 @@ -65,7 +65,7 @@ const GenerationHistoryModal: React.FC = ({ - {history.map((gen) => { + {(history ?? []).map((gen) => { const statusClass = `ep-gh-status-tag--${gen.status}`; const canCancel = gen.status === "rendering" || gen.status === "editing"; diff --git a/apps/web/src/pages/products/ProductLibrary.tsx b/apps/web/src/pages/products/ProductLibrary.tsx old mode 100644 new mode 100755 index 1d85fa3f8..0ef36d844 --- a/apps/web/src/pages/products/ProductLibrary.tsx +++ b/apps/web/src/pages/products/ProductLibrary.tsx @@ -587,8 +587,11 @@ const ProductLibrary: React.FC = () => { staleTime: 30_000, }); - // 映射为前端类型 - const products = useMemo(() => apiProducts.map(mapApiProduct), [apiProducts]); + // 映射为前端类型,防御非数组返回 + const products = useMemo( + () => (Array.isArray(apiProducts) ? apiProducts : []).map(mapApiProduct), + [apiProducts], + ); /* ── 删除 mutation ── */ const deleteMutation = useMutation({ -- 2.54.0