Skip to content

Commit be17ba7

Browse files
committed
feat: 适配器异常处理成响应异常
1 parent adb9dbe commit be17ba7

File tree

7 files changed

+103
-37
lines changed

7 files changed

+103
-37
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ lib/
1919
*.test.js
2020
*.test.d.ts
2121
*.test.js.map
22-
coverage
22+
.coverage
2323

2424
# eslint
2525
.eslintcache

src/adapter.ts

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
isEmptyArray,
33
isFunction,
44
isPlainObject,
5+
isString,
56
isUndefined,
67
} from './helpers/isTypes';
78
import { assert } from './helpers/error';
@@ -57,6 +58,19 @@ export interface AxiosAdapterResponseError extends AnyObject {
5758
* 响应头
5859
*/
5960
headers: AnyObject;
61+
/**
62+
* 错误数据
63+
*/
64+
data?: {
65+
/**
66+
* 错误信息
67+
*/
68+
errMsg: string;
69+
/**
70+
* Errno错误码
71+
*/
72+
errno: number;
73+
};
6074
}
6175

6276
export interface AxiosAdapterRequestConfig extends AnyObject {
@@ -253,22 +267,25 @@ export function createAdapter(platform: AxiosPlatform) {
253267
return download(options);
254268
}
255269

256-
function transformResult(result: AnyObject): void {
257-
result.status =
258-
result.status ??
259-
result.statusCode ??
260-
(isUndefined(result.data) ? 400 : 200);
261-
result.statusText =
262-
result.status === 200
263-
? 'OK'
264-
: result.status === 400
265-
? 'Bad Adapter'
266-
: result.errMsg;
267-
result.headers = result.headers || result.header;
268-
269-
if (result.statusCode) delete result.statusCode;
270-
if (result.errMsg) delete result.errMsg;
271-
if (result.header) delete result.header;
270+
function transformResponse(response: AnyObject): void {
271+
response.status = response.status ?? response.statusCode;
272+
response.statusText = 'OK';
273+
274+
if (isUndefined(response.status)) {
275+
response.status = 400;
276+
response.statusText = 'Fail Adapter';
277+
}
278+
279+
response.headers = response.headers ?? response.header ?? {};
280+
281+
if (isUndefined(response.data) && isString(response.errMsg)) {
282+
response.data = {
283+
errMsg: response.errMsg,
284+
errno: response.errno,
285+
};
286+
}
287+
288+
cleanResponse(response, ['statusCode', 'errMsg', 'errno', 'header']);
272289
}
273290

274291
function transformOptions(
@@ -278,11 +295,11 @@ export function createAdapter(platform: AxiosPlatform) {
278295
...config,
279296
header: config.headers,
280297
success(response): void {
281-
transformResult(response);
298+
transformResponse(response);
282299
config.success(response);
283300
},
284301
fail(error: AxiosAdapterResponseError): void {
285-
transformResult(error);
302+
transformResponse(error);
286303
config.fail(error);
287304
},
288305
};
@@ -297,9 +314,16 @@ export function createAdapter(platform: AxiosPlatform) {
297314
response.apFilePath,
298315
};
299316

300-
if (response.tempFilePath) delete response.tempFilePath;
301-
if (response.apFilePath) delete response.apFilePath;
302-
if (response.filePath) delete response.filePath;
317+
cleanResponse(response, ['tempFilePath', 'apFilePath', 'filePath']);
318+
}
319+
320+
/**
321+
* 清理 response 上多余的 key
322+
*/
323+
function cleanResponse(response: AnyObject, keys: string[]) {
324+
for (const key of keys) {
325+
if (key in response) delete response[key];
326+
}
303327
}
304328

305329
return adapter;

src/core/Axios.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export interface AxiosResponse<
186186

187187
export interface AxiosResponseError extends AxiosAdapterResponseError {
188188
/**
189-
* 原生接口 fail 回调产生的响应错误
189+
* 失败的请求,指没能够成功响应的请求
190190
*/
191191
isFail: true;
192192
/**

src/core/request.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
AxiosAdapterRequestMethod,
55
AxiosAdapterResponse,
66
AxiosAdapterResponseError,
7+
AxiosAdapterTask,
78
} from '../adapter';
89
import {
910
AxiosProgressCallback,
@@ -49,7 +50,16 @@ export function request(config: AxiosRequestConfig) {
4950
fail,
5051
};
5152

52-
const adapterTask = adapter!(adapterConfig);
53+
let adapterTask: AxiosAdapterTask;
54+
try {
55+
adapterTask = adapter!(adapterConfig);
56+
} catch {
57+
fail({
58+
status: 400,
59+
statusText: 'Bad Adapter',
60+
headers: {},
61+
});
62+
}
5363

5464
function success(_: AxiosAdapterResponse): void {
5565
const response = _ as AxiosResponse;

test/adapter.test.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,14 @@ describe('src/adapter.ts', () => {
253253
};
254254
const p2 = {
255255
...p1,
256-
request: vi.fn(({ fail }) => fail({ data: { result: null } })),
256+
request: vi.fn(({ fail }) =>
257+
fail({ status: 500, data: { result: null } }),
258+
),
257259
};
258260
const p3 = {
259261
...p1,
260262
request: vi.fn(({ fail }) =>
261-
fail({ statusCode: 500, header: {}, errMsg: 'request:fail' }),
263+
fail({ errMsg: 'request:fail', errno: 1000 }),
262264
),
263265
};
264266
const c1 = {
@@ -269,9 +271,9 @@ describe('src/adapter.ts', () => {
269271
fail: (response: any) => {
270272
expect(response).toMatchInlineSnapshot(`
271273
{
272-
"headers": undefined,
274+
"headers": {},
273275
"status": 400,
274-
"statusText": "Bad Adapter",
276+
"statusText": "Fail Adapter",
275277
}
276278
`);
277279
},
@@ -284,8 +286,8 @@ describe('src/adapter.ts', () => {
284286
"data": {
285287
"result": null,
286288
},
287-
"headers": undefined,
288-
"status": 200,
289+
"headers": {},
290+
"status": 500,
289291
"statusText": "OK",
290292
}
291293
`);
@@ -296,9 +298,13 @@ describe('src/adapter.ts', () => {
296298
fail: (response: any) => {
297299
expect(response).toMatchInlineSnapshot(`
298300
{
301+
"data": {
302+
"errMsg": "request:fail",
303+
"errno": 1000,
304+
},
299305
"headers": {},
300-
"status": 500,
301-
"statusText": "request:fail",
306+
"status": 400,
307+
"statusText": "Fail Adapter",
302308
}
303309
`);
304310
},

test/core/dispatchRequest.test.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,42 @@ describe('src/core/dispatchRequest.ts', () => {
3737
).not.toThrowError();
3838
});
3939

40-
test('坏的适配器', () => {
41-
expect(() =>
40+
test('坏的适配器应该抛出异常', () => {
41+
expect(
4242
dispatchRequest({
4343
adapter: () => {
4444
throw 'bad adapter';
4545
},
4646
url: '/',
4747
method: 'get',
48-
}),
49-
).toMatchInlineSnapshot('[Function]');
48+
}).catch((e) => ({ ...e })),
49+
).resolves.toMatchInlineSnapshot(`
50+
{
51+
"config": {
52+
"adapter": [Function],
53+
"data": undefined,
54+
"headers": undefined,
55+
"method": "get",
56+
"url": "",
57+
},
58+
"request": undefined,
59+
"response": {
60+
"config": {
61+
"adapter": [Function],
62+
"data": undefined,
63+
"headers": undefined,
64+
"method": "get",
65+
"url": "",
66+
},
67+
"data": undefined,
68+
"headers": {},
69+
"isFail": true,
70+
"request": undefined,
71+
"status": 400,
72+
"statusText": "Bad Adapter",
73+
},
74+
}
75+
`);
5076
});
5177

5278
test('应该支持转换 URL', () => {

vitest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineConfig({
1010
},
1111
coverage: {
1212
provider: 'istanbul',
13-
reportsDirectory: resolve('test/coverage'),
13+
reportsDirectory: resolve('test/.coverage'),
1414
enabled: false,
1515
include: ['src/**/*.ts'],
1616
},

0 commit comments

Comments
 (0)