From 3b377c178cd1b3190ada02622ad1e67935893279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=9E=E5=8F=AF=20=C2=B7=20YU=20KE?= <1798456934@qq.com> Date: Mon, 7 Sep 2026 21:58:53 +0800 Subject: [PATCH] fix(@vben/request): preserve response metadata on errors (#8377) * fix(request): preserve response metadata on errors * style(request): order interceptor test imports --- .changeset/gentle-requests-return.md | 5 +++ .../src/request-client/request-client.test.ts | 36 +++++++++++++++++++ .../src/request-client/request-client.ts | 20 +++++------ 3 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 .changeset/gentle-requests-return.md diff --git a/.changeset/gentle-requests-return.md b/.changeset/gentle-requests-return.md new file mode 100644 index 000000000..9d864d358 --- /dev/null +++ b/.changeset/gentle-requests-return.md @@ -0,0 +1,5 @@ +--- +'@vben/request': patch +--- + +fix: preserve response metadata when requests fail diff --git a/packages/effects/request/src/request-client/request-client.test.ts b/packages/effects/request/src/request-client/request-client.test.ts index 661753496..d3f9bd158 100644 --- a/packages/effects/request/src/request-client/request-client.test.ts +++ b/packages/effects/request/src/request-client/request-client.test.ts @@ -2,6 +2,10 @@ import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { + defaultResponseInterceptor, + errorMessageResponseInterceptor, +} from './preset-interceptors'; import { RequestClient } from './request-client'; describe('requestClient', () => { @@ -64,6 +68,38 @@ describe('requestClient', () => { }); }); + it('should preserve response metadata when an interceptor rejects', async () => { + requestClient.addResponseInterceptor( + defaultResponseInterceptor({ + codeField: 'code', + dataField: 'data', + successCode: 0, + }), + ); + requestClient.addResponseInterceptor(errorMessageResponseInterceptor()); + mock.onGet('/test/interceptor-error').reply(200, { + code: 1001, + data: null, + message: 'request failed', + }); + + await expect( + requestClient.get('/test/interceptor-error', { + responseReturn: 'data', + }), + ).rejects.toMatchObject({ + response: { + data: { + code: 1001, + data: null, + message: 'request failed', + }, + status: 200, + }, + status: 200, + }); + }); + it('should successfully upload a file', async () => { const fileData = new Blob(['file contents'], { type: 'text/plain' }); diff --git a/packages/effects/request/src/request-client/request-client.ts b/packages/effects/request/src/request-client/request-client.ts index 453913b27..d2715c0c0 100644 --- a/packages/effects/request/src/request-client/request-client.ts +++ b/packages/effects/request/src/request-client/request-client.ts @@ -146,18 +146,14 @@ class RequestClient { url: string, config: RequestClientConfig, ): Promise { - try { - const response: AxiosResponse = await this.instance({ - url, - ...config, - ...(config.paramsSerializer - ? { paramsSerializer: getParamsSerializer(config.paramsSerializer) } - : {}), - }); - return response as T; - } catch (error: any) { - throw error.response ? error.response.data : error; - } + const response: AxiosResponse = await this.instance({ + url, + ...config, + ...(config.paramsSerializer + ? { paramsSerializer: getParamsSerializer(config.paramsSerializer) } + : {}), + }); + return response as T; } }