From 9f58350b4a5834b8cf29948fb49ddbea2a6edd54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Mon, 31 Aug 2026 19:18:57 +0800 Subject: [PATCH] =?UTF-8?q?task-4:=20extractErrorMessage=20=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=AF=BC=E5=87=BA=E5=B9=B6=E8=A6=86=E7=9B=96=20error/?= =?UTF-8?q?message/msg=20=E4=B8=89=E5=AD=97=E6=AE=B5=EF=BC=88=E7=A9=BA?= =?UTF-8?q?=E7=99=BD=E8=B7=B3=E8=BF=87=E3=80=81=E4=BC=98=E5=85=88=E7=BA=A7?= =?UTF-8?q?=20error>message>msg=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend-vue/src/shared/api/http.ts | 14 +++--- frontend-vue/tests/extract-error.test.ts | 58 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 frontend-vue/tests/extract-error.test.ts diff --git a/frontend-vue/src/shared/api/http.ts b/frontend-vue/src/shared/api/http.ts index 87004e95..2193fe25 100644 --- a/frontend-vue/src/shared/api/http.ts +++ b/frontend-vue/src/shared/api/http.ts @@ -25,16 +25,18 @@ export interface JavaApiResponse { } export type RequestOptions = AxiosRequestConfig -function extractErrorMessage(error: unknown) { +export function extractErrorMessage(error: unknown) { if (error instanceof AxiosError) { const data = error.response?.data if (data && typeof data === 'object') { - if ('error' in data && data.error) { - return String(data.error) - } - if ('message' in data && data.message) { - return String(data.message) + for (const field of ['error', 'message', 'msg'] as const) { + if (field in data && typeof (data as Record)[field] === 'string') { + const value = ((data as Record)[field]).trim() + if (value) { + return value + } + } } } diff --git a/frontend-vue/tests/extract-error.test.ts b/frontend-vue/tests/extract-error.test.ts new file mode 100644 index 00000000..a1136b92 --- /dev/null +++ b/frontend-vue/tests/extract-error.test.ts @@ -0,0 +1,58 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { AxiosError } from 'axios' +import { extractErrorMessage } from '../src/shared/api/http.ts' + +function makeAxiosError(status: number, data: unknown) { + return new AxiosError('Request failed with status code ' + status, String(status), undefined, undefined, { + status, + data, + statusText: '', + headers: {}, + config: {} as never, + }) +} + +test('test_extract_error_field', () => { + const error = makeAxiosError(400, { error: '字段校验失败' }) + assert.equal(extractErrorMessage(error), '字段校验失败') +}) + +test('test_extract_message_field', () => { + const error = makeAxiosError(500, { message: '服务器内部错误' }) + assert.equal(extractErrorMessage(error), '服务器内部错误') +}) + +test('test_extract_msg_field', () => { + const error = makeAxiosError(400, { msg: '任务已存在' }) + assert.equal(extractErrorMessage(error), '任务已存在') +}) + +test('test_extract_error_precedence', () => { + const error = makeAxiosError(400, { error: 'e1', message: 'm1', msg: 'm2' }) + assert.equal(extractErrorMessage(error), 'e1', 'error 应优先') + + const noError = makeAxiosError(400, { message: 'm1', msg: 'm2' }) + assert.equal(extractErrorMessage(noError), 'm1', '无 error 时 message 优先于 msg') +}) + +test('test_extract_string_body', () => { + const error = makeAxiosError(502, 'Bad Gateway 网关错误') + assert.equal(extractErrorMessage(error), 'Bad Gateway 网关错误') +}) + +test('test_extract_fallback_message', () => { + const error = makeAxiosError(500, {}) + assert.equal(extractErrorMessage(error), 'Request failed with status code 500') +}) + +test('test_extract_axios_non_error', () => { + assert.equal(extractErrorMessage(new Error('普通错误')), '普通错误') + assert.equal(extractErrorMessage('纯字符串'), '请求失败') + assert.equal(extractErrorMessage(undefined), '请求失败') +}) + +test('test_extract_blank_values_skipped', () => { + const error = makeAxiosError(400, { error: ' ', message: '', msg: '真实原因' }) + assert.equal(extractErrorMessage(error), '真实原因', '空白 error/message 应跳过,回退 msg') +})