feat: 添加新的 API isAxiosError
parent
7e29e91f0a
commit
61337a9bbe
|
@ -10,7 +10,6 @@ import {
|
||||||
AxiosRequestFormData,
|
AxiosRequestFormData,
|
||||||
AxiosRequestHeaders,
|
AxiosRequestHeaders,
|
||||||
AxiosResponse,
|
AxiosResponse,
|
||||||
AxiosResponseError,
|
|
||||||
} from './core/Axios';
|
} from './core/Axios';
|
||||||
|
|
||||||
export type AxiosAdapterRequestType = 'request' | 'download' | 'upload';
|
export type AxiosAdapterRequestType = 'request' | 'download' | 'upload';
|
||||||
|
@ -267,7 +266,7 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
|
||||||
transformResult(response);
|
transformResult(response);
|
||||||
config.success(response);
|
config.success(response);
|
||||||
},
|
},
|
||||||
fail(error: AxiosResponseError): void {
|
fail(error: AxiosAdapterResponseError): void {
|
||||||
transformResult(error);
|
transformResult(error);
|
||||||
config.fail(error);
|
config.fail(error);
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
|
import { isString } from './helpers/isTypes';
|
||||||
import Axios, {
|
import Axios, {
|
||||||
AxiosConstructor,
|
AxiosConstructor,
|
||||||
AxiosRequestConfig,
|
AxiosRequestConfig,
|
||||||
|
@ -6,8 +6,9 @@ import Axios, {
|
||||||
AxiosResponse,
|
AxiosResponse,
|
||||||
} from './core/Axios';
|
} from './core/Axios';
|
||||||
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
|
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
|
||||||
|
import { isAxiosError } from './core/createError';
|
||||||
import { mergeConfig } from './core/mergeConfig';
|
import { mergeConfig } from './core/mergeConfig';
|
||||||
import { isString } from './helpers/isTypes';
|
import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
|
||||||
import defaults from './defaults';
|
import defaults from './defaults';
|
||||||
|
|
||||||
export interface AxiosInstanceDefaults extends AxiosRequestHeaders {
|
export interface AxiosInstanceDefaults extends AxiosRequestHeaders {
|
||||||
|
@ -27,7 +28,8 @@ export interface AxiosStatic extends AxiosInstance {
|
||||||
CancelToken: CancelTokenConstructor;
|
CancelToken: CancelTokenConstructor;
|
||||||
create(defaults?: AxiosRequestConfig): AxiosInstance;
|
create(defaults?: AxiosRequestConfig): AxiosInstance;
|
||||||
createAdapter(platform: AxiosPlatform): AxiosAdapter;
|
createAdapter(platform: AxiosPlatform): AxiosAdapter;
|
||||||
isCancel(value: unknown): boolean;
|
isCancel: typeof isCancel;
|
||||||
|
isAxiosError: typeof isAxiosError;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createInstance(defaults: AxiosRequestConfig): AxiosInstance {
|
function createInstance(defaults: AxiosRequestConfig): AxiosInstance {
|
||||||
|
@ -61,5 +63,6 @@ axios.create = function create(defaults: AxiosRequestConfig): AxiosInstance {
|
||||||
};
|
};
|
||||||
axios.createAdapter = createAdapter;
|
axios.createAdapter = createAdapter;
|
||||||
axios.isCancel = isCancel;
|
axios.isCancel = isCancel;
|
||||||
|
axios.isAxiosError = isAxiosError;
|
||||||
|
|
||||||
export default axios;
|
export default axios;
|
||||||
|
|
|
@ -5,8 +5,8 @@ import {
|
||||||
AxiosAdapterRequestMethod,
|
AxiosAdapterRequestMethod,
|
||||||
AxiosAdapterTask,
|
AxiosAdapterTask,
|
||||||
AxiosAdapterResponse,
|
AxiosAdapterResponse,
|
||||||
AxiosAdapterResponseError,
|
|
||||||
AxiosAdapterRequestConfig,
|
AxiosAdapterRequestConfig,
|
||||||
|
AxiosAdapterResponseError,
|
||||||
} from '../adapter';
|
} from '../adapter';
|
||||||
import { CancelToken } from './cancel';
|
import { CancelToken } from './cancel';
|
||||||
import dispatchRequest from './dispatchRequest';
|
import dispatchRequest from './dispatchRequest';
|
||||||
|
@ -130,6 +130,7 @@ export interface AxiosResponse<TData = unknown>
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AxiosResponseError extends AxiosAdapterResponseError {
|
export interface AxiosResponseError extends AxiosAdapterResponseError {
|
||||||
|
isFail: true;
|
||||||
config?: AxiosRequestConfig;
|
config?: AxiosRequestConfig;
|
||||||
request?: AxiosAdapterTask;
|
request?: AxiosAdapterTask;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,6 @@ import { AxiosRequestConfig, AxiosResponse, AxiosResponseError } from './Axios';
|
||||||
export type AxiosErrorResponse = AxiosResponse | AxiosResponseError;
|
export type AxiosErrorResponse = AxiosResponse | AxiosResponseError;
|
||||||
|
|
||||||
class AxiosError extends Error {
|
class AxiosError extends Error {
|
||||||
public isAxiosError = true;
|
|
||||||
|
|
||||||
public config: AxiosRequestConfig;
|
public config: AxiosRequestConfig;
|
||||||
|
|
||||||
public request?: AxiosAdapterTask;
|
public request?: AxiosAdapterTask;
|
||||||
|
@ -39,3 +37,7 @@ export function createError(
|
||||||
cleanStack(axiosError);
|
cleanStack(axiosError);
|
||||||
return axiosError;
|
return axiosError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isAxiosError(value: unknown): value is AxiosError {
|
||||||
|
return value instanceof AxiosError;
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@ import { assert } from '../helpers/error';
|
||||||
import {
|
import {
|
||||||
AxiosAdapterRequestConfig,
|
AxiosAdapterRequestConfig,
|
||||||
AxiosAdapterRequestMethod,
|
AxiosAdapterRequestMethod,
|
||||||
|
AxiosAdapterResponse,
|
||||||
|
AxiosAdapterResponseError,
|
||||||
AxiosAdapterTask,
|
AxiosAdapterTask,
|
||||||
} from '../adapter';
|
} from '../adapter';
|
||||||
import {
|
import {
|
||||||
|
@ -58,7 +60,8 @@ export function request<TData = unknown>(
|
||||||
| AxiosAdapterTask
|
| AxiosAdapterTask
|
||||||
| undefined;
|
| undefined;
|
||||||
|
|
||||||
function success(response: AxiosResponse<TData>): void {
|
function success(_: AxiosAdapterResponse<TData>): void {
|
||||||
|
const response = _ as AxiosResponse<TData>;
|
||||||
response.config = config;
|
response.config = config;
|
||||||
response.request = adapterTask;
|
response.request = adapterTask;
|
||||||
if (
|
if (
|
||||||
|
@ -71,7 +74,9 @@ export function request<TData = unknown>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function fail(error: AxiosResponseError): void {
|
function fail(_: AxiosAdapterResponseError): void {
|
||||||
|
const error = _ as AxiosResponseError;
|
||||||
|
error.isFail = true;
|
||||||
error.config = config;
|
error.config = config;
|
||||||
error.request = adapterTask;
|
error.request = adapterTask;
|
||||||
catchError('网络错误', error);
|
catchError('网络错误', error);
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { describe, test, expect, beforeAll, afterAll } from 'vitest';
|
import { describe, test, expect, beforeAll, afterAll } from 'vitest';
|
||||||
import { mockAdapter } from 'scripts/test.utils';
|
import { mockAdapter } from 'scripts/test.utils';
|
||||||
import Axios from '../src/core/Axios';
|
import Axios from '../src/core/Axios';
|
||||||
import { CancelToken } from '../src/core/cancel';
|
import { CancelToken, isCancel } from '../src/core/cancel';
|
||||||
|
import { isAxiosError } from '../src/core/createError';
|
||||||
import { createAdapter } from '../src/adapter';
|
import { createAdapter } from '../src/adapter';
|
||||||
import defaults from '../src/defaults';
|
import defaults from '../src/defaults';
|
||||||
import axios from '../src/axios';
|
import axios from '../src/axios';
|
||||||
|
@ -24,11 +25,13 @@ describe('src/axios.ts', () => {
|
||||||
expect(axios.Axios).toBe(Axios);
|
expect(axios.Axios).toBe(Axios);
|
||||||
expect(axios.CancelToken).toBe(CancelToken);
|
expect(axios.CancelToken).toBe(CancelToken);
|
||||||
expect(axios.createAdapter).toBe(createAdapter);
|
expect(axios.createAdapter).toBe(createAdapter);
|
||||||
|
expect(axios.isCancel).toBe(isCancel);
|
||||||
|
expect(axios.isAxiosError).toBe(isAxiosError);
|
||||||
|
|
||||||
expect(axios.interceptors).toBeTypeOf('object');
|
expect(axios.interceptors).toBeTypeOf('object');
|
||||||
expect(axios.create).toBeTypeOf('function');
|
expect(axios.create).toBeTypeOf('function');
|
||||||
expect(axios.request).toBeTypeOf('function');
|
expect(axios.request).toBeTypeOf('function');
|
||||||
expect(axios.isCancel).toBeTypeOf('function');
|
|
||||||
expect(axios.getUri).toBeTypeOf('function');
|
expect(axios.getUri).toBeTypeOf('function');
|
||||||
|
|
||||||
[...Axios.as, ...Axios.pas, ...Axios.das].forEach((k) => {
|
[...Axios.as, ...Axios.pas, ...Axios.das].forEach((k) => {
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
import { describe, test, expect } from 'vitest';
|
import { describe, test, expect } from 'vitest';
|
||||||
import { checkStack } from 'scripts/test.utils';
|
import { checkStack } from 'scripts/test.utils';
|
||||||
import { createError } from 'src/core/createError';
|
import { createError, isAxiosError } from 'src/core/createError';
|
||||||
|
|
||||||
describe('src/core/createError.ts', () => {
|
describe('src/core/createError.ts', () => {
|
||||||
test('应该支持空参数', () => {
|
test('应该支持空参数', () => {
|
||||||
const c = {};
|
const c = {};
|
||||||
const err = createError('error', c);
|
const err = createError('error', c);
|
||||||
|
|
||||||
expect(err.isAxiosError).toBeTruthy();
|
|
||||||
expect(err.message).toBe('error');
|
expect(err.message).toBe('error');
|
||||||
expect(err.config).toBe(c);
|
expect(err.config).toBe(c);
|
||||||
expect(checkStack(err)).toBeTruthy();
|
expect(checkStack(err)).toBeTruthy();
|
||||||
|
@ -24,4 +23,10 @@ describe('src/core/createError.ts', () => {
|
||||||
expect(err.request).toBe(req);
|
expect(err.request).toBe(req);
|
||||||
expect(err.response).toBe(res);
|
expect(err.response).toBe(res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('应该正确判断 AxiosError', () => {
|
||||||
|
expect(isAxiosError(0)).toBeFalsy();
|
||||||
|
expect(isAxiosError(new Error())).toBeFalsy();
|
||||||
|
expect(isAxiosError(createError('error', {}))).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue