From 83d990fa28320b2dff2b3ba4731fbc07c282793c Mon Sep 17 00:00:00 2001 From: snqu-526 Date: Fri, 21 Feb 2025 11:33:32 +0800 Subject: [PATCH 1/2] fix: Add optional chaining to headers returned by requestAdapter --- packages/adapter-axios/src/requestAdapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-axios/src/requestAdapter.ts b/packages/adapter-axios/src/requestAdapter.ts index 1befb0fc..3fd81c92 100644 --- a/packages/adapter-axios/src/requestAdapter.ts +++ b/packages/adapter-axios/src/requestAdapter.ts @@ -37,7 +37,7 @@ export default function requestAdapter(options: AdapterCreateOptions = {}) { return { response: () => responsePromise, - headers: () => responsePromise.then(res => res.headers as AxiosResponseHeaders), + headers: () => responsePromise.then(res => res?.headers as AxiosResponseHeaders), abort: () => { controller.abort(); }, From 86ab54e386d726a930ef9dfbea5420c61ba143ad Mon Sep 17 00:00:00 2001 From: JOU Amjs Date: Fri, 21 Feb 2025 12:19:16 +0800 Subject: [PATCH 2/2] fix: to be compatible with falsy data by axios adapter close #635 --- .changeset/famous-gorillas-act.md | 5 +++ packages/adapter-axios/src/requestAdapter.ts | 6 +-- .../test/browser/requestAdapter.spec.ts | 38 ++++++++++++++++++- 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 .changeset/famous-gorillas-act.md diff --git a/.changeset/famous-gorillas-act.md b/.changeset/famous-gorillas-act.md new file mode 100644 index 00000000..7273d1b1 --- /dev/null +++ b/.changeset/famous-gorillas-act.md @@ -0,0 +1,5 @@ +--- +'@alova/adapter-axios': patch +--- + +to be compatible with falsy data by axios adapter diff --git a/packages/adapter-axios/src/requestAdapter.ts b/packages/adapter-axios/src/requestAdapter.ts index 3fd81c92..56e39e1f 100644 --- a/packages/adapter-axios/src/requestAdapter.ts +++ b/packages/adapter-axios/src/requestAdapter.ts @@ -1,6 +1,6 @@ -import { noop, undefinedValue } from '@alova/shared'; +import { newInstance, noop, undefinedValue } from '@alova/shared'; import type { ProgressUpdater } from 'alova'; -import axios, { AxiosResponseHeaders } from 'axios'; +import axios, { AxiosHeaders, AxiosResponseHeaders } from 'axios'; import { AdapterCreateOptions, AxiosRequestAdapter } from '~/typings'; /** @@ -37,7 +37,7 @@ export default function requestAdapter(options: AdapterCreateOptions = {}) { return { response: () => responsePromise, - headers: () => responsePromise.then(res => res?.headers as AxiosResponseHeaders), + headers: () => responsePromise.then(res => (res?.headers || newInstance(AxiosHeaders)) as AxiosResponseHeaders), abort: () => { controller.abort(); }, diff --git a/packages/adapter-axios/test/browser/requestAdapter.spec.ts b/packages/adapter-axios/test/browser/requestAdapter.spec.ts index 5b682d30..26e703e6 100644 --- a/packages/adapter-axios/test/browser/requestAdapter.spec.ts +++ b/packages/adapter-axios/test/browser/requestAdapter.spec.ts @@ -1,6 +1,6 @@ import { axiosRequestAdapter } from '@/index'; import { createAlova } from 'alova'; -import axios, { AxiosError } from 'axios'; +import axios, { AxiosError, AxiosHeaders } from 'axios'; import { readFileSync } from 'node:fs'; import path from 'path'; import { Result, delay } from 'root/testUtils'; @@ -249,4 +249,40 @@ describe('request adapter', () => { }); expect(data.data.path).toBe('/unit-test'); }); + + test('should return an empty axios header when receiving headers is falsy value', async () => { + const axiosInst = axios.create({ + baseURL, + timeout: 5000 + }); + let mockResponse: any = null; + axiosInst.interceptors.response.use(() => mockResponse); + + const alovaInst = createAlova({ + requestAdapter: axiosRequestAdapter({ + axios: axiosInst + }) + }); + + const transformFn = vi.fn(); + const Get = alovaInst.Get('/unit-test', { + params: { + a: '1', + b: '2' + }, + transform(data: any, headers) { + transformFn(headers); + return data; + } + }); + + const data = await Get; + expect(data).toBeNull(); + expect(transformFn).toHaveBeenLastCalledWith(new AxiosHeaders()); + + mockResponse = {}; + const data2 = await Get; + expect(data2).toStrictEqual({}); + expect(transformFn).toHaveBeenLastCalledWith(new AxiosHeaders()); + }); });