From 30393c286724455eb3da98e29a5b95031e7b55f3 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 6 Mar 2026 10:48:29 -0800 Subject: [PATCH] fix(admin-web): guard versions list with Array.isArray + bump parse timeout to 300s MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Prevent TypeError if useApi returns non-array shape - Add HttpClient.get logging to trace raw vs unwrapped response - Parse timeout: 120s → 300s (matches upload, avoids timeout on large files) - Show hint for large files (>30MB) during parse Co-Authored-By: Claude Sonnet 4.6 --- frontend/admin-web/src/infrastructure/http/http.client.ts | 5 ++++- .../src/views/app-versions/AppVersionManagementPage.tsx | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/admin-web/src/infrastructure/http/http.client.ts b/frontend/admin-web/src/infrastructure/http/http.client.ts index e8c9e09..efabfaf 100644 --- a/frontend/admin-web/src/infrastructure/http/http.client.ts +++ b/frontend/admin-web/src/infrastructure/http/http.client.ts @@ -102,7 +102,10 @@ class HttpClient { async get(url: string, config?: AxiosRequestConfig): Promise { const response: AxiosResponse = await this.client.get(url, config); - return response.data?.data ?? response.data; + const raw = response.data; + const result = raw?.data ?? raw; + console.log('[HttpClient.get]', url, '→ raw:', raw, '→ result:', result, 'isArray:', Array.isArray(result)); + return result; } async post(url: string, data?: unknown, config?: AxiosRequestConfig): Promise { diff --git a/frontend/admin-web/src/views/app-versions/AppVersionManagementPage.tsx b/frontend/admin-web/src/views/app-versions/AppVersionManagementPage.tsx index d364ecf..7541263 100644 --- a/frontend/admin-web/src/views/app-versions/AppVersionManagementPage.tsx +++ b/frontend/admin-web/src/views/app-versions/AppVersionManagementPage.tsx @@ -150,7 +150,8 @@ export const AppVersionManagementPage: React.FC = () => { refetch(); }; - const list = versions ?? []; + console.log('[AppVersions] useApi versions:', versions, 'isArray:', Array.isArray(versions)); + const list = Array.isArray(versions) ? versions : []; return (
@@ -325,7 +326,7 @@ const UploadModal: React.FC<{ versionCode?: number; versionName?: string; minSdkVersion?: string; }>('/api/v1/admin/versions/parse', formData, { headers: { 'Content-Type': 'multipart/form-data' }, - timeout: 120000, + timeout: 300000, }); console.log('[Upload] Parse result:', info); if (info?.versionName) setVersionName(info.versionName); @@ -386,7 +387,7 @@ const UploadModal: React.FC<{ {file.name} ({(file.size / 1024 / 1024).toFixed(1)} MB)
)} - {parsing &&
{t('app_version_parsing')}
} + {parsing &&
{t('app_version_parsing')}{file && file.size > 30 * 1024 * 1024 ? '(大文件,请耐心等待...)' : ''}
} {parseWarning &&
{parseWarning}
}