feat: 添加新的 API isAxiosError

pull/41/head
zjx0905 2023-04-05 13:31:48 +08:00
parent 7e29e91f0a
commit 61337a9bbe
7 changed files with 32 additions and 14 deletions

View File

@ -10,7 +10,6 @@ import {
AxiosRequestFormData,
AxiosRequestHeaders,
AxiosResponse,
AxiosResponseError,
} from './core/Axios';
export type AxiosAdapterRequestType = 'request' | 'download' | 'upload';
@ -267,7 +266,7 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
transformResult(response);
config.success(response);
},
fail(error: AxiosResponseError): void {
fail(error: AxiosAdapterResponseError): void {
transformResult(error);
config.fail(error);
},

View File

@ -1,4 +1,4 @@
import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
import { isString } from './helpers/isTypes';
import Axios, {
AxiosConstructor,
AxiosRequestConfig,
@ -6,8 +6,9 @@ import Axios, {
AxiosResponse,
} from './core/Axios';
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
import { isAxiosError } from './core/createError';
import { mergeConfig } from './core/mergeConfig';
import { isString } from './helpers/isTypes';
import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
import defaults from './defaults';
export interface AxiosInstanceDefaults extends AxiosRequestHeaders {
@ -27,7 +28,8 @@ export interface AxiosStatic extends AxiosInstance {
CancelToken: CancelTokenConstructor;
create(defaults?: AxiosRequestConfig): AxiosInstance;
createAdapter(platform: AxiosPlatform): AxiosAdapter;
isCancel(value: unknown): boolean;
isCancel: typeof isCancel;
isAxiosError: typeof isAxiosError;
}
function createInstance(defaults: AxiosRequestConfig): AxiosInstance {
@ -61,5 +63,6 @@ axios.create = function create(defaults: AxiosRequestConfig): AxiosInstance {
};
axios.createAdapter = createAdapter;
axios.isCancel = isCancel;
axios.isAxiosError = isAxiosError;
export default axios;

View File

@ -5,8 +5,8 @@ import {
AxiosAdapterRequestMethod,
AxiosAdapterTask,
AxiosAdapterResponse,
AxiosAdapterResponseError,
AxiosAdapterRequestConfig,
AxiosAdapterResponseError,
} from '../adapter';
import { CancelToken } from './cancel';
import dispatchRequest from './dispatchRequest';
@ -130,6 +130,7 @@ export interface AxiosResponse<TData = unknown>
}
export interface AxiosResponseError extends AxiosAdapterResponseError {
isFail: true;
config?: AxiosRequestConfig;
request?: AxiosAdapterTask;
}

View File

@ -5,8 +5,6 @@ import { AxiosRequestConfig, AxiosResponse, AxiosResponseError } from './Axios';
export type AxiosErrorResponse = AxiosResponse | AxiosResponseError;
class AxiosError extends Error {
public isAxiosError = true;
public config: AxiosRequestConfig;
public request?: AxiosAdapterTask;
@ -39,3 +37,7 @@ export function createError(
cleanStack(axiosError);
return axiosError;
}
export function isAxiosError(value: unknown): value is AxiosError {
return value instanceof AxiosError;
}

View File

@ -3,6 +3,8 @@ import { assert } from '../helpers/error';
import {
AxiosAdapterRequestConfig,
AxiosAdapterRequestMethod,
AxiosAdapterResponse,
AxiosAdapterResponseError,
AxiosAdapterTask,
} from '../adapter';
import {
@ -58,7 +60,8 @@ export function request<TData = unknown>(
| AxiosAdapterTask
| undefined;
function success(response: AxiosResponse<TData>): void {
function success(_: AxiosAdapterResponse<TData>): void {
const response = _ as AxiosResponse<TData>;
response.config = config;
response.request = adapterTask;
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.request = adapterTask;
catchError('网络错误', error);

View File

@ -1,7 +1,8 @@
import { describe, test, expect, beforeAll, afterAll } from 'vitest';
import { mockAdapter } from 'scripts/test.utils';
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 defaults from '../src/defaults';
import axios from '../src/axios';
@ -24,11 +25,13 @@ describe('src/axios.ts', () => {
expect(axios.Axios).toBe(Axios);
expect(axios.CancelToken).toBe(CancelToken);
expect(axios.createAdapter).toBe(createAdapter);
expect(axios.isCancel).toBe(isCancel);
expect(axios.isAxiosError).toBe(isAxiosError);
expect(axios.interceptors).toBeTypeOf('object');
expect(axios.create).toBeTypeOf('function');
expect(axios.request).toBeTypeOf('function');
expect(axios.isCancel).toBeTypeOf('function');
expect(axios.getUri).toBeTypeOf('function');
[...Axios.as, ...Axios.pas, ...Axios.das].forEach((k) => {

View File

@ -1,13 +1,12 @@
import { describe, test, expect } from 'vitest';
import { checkStack } from 'scripts/test.utils';
import { createError } from 'src/core/createError';
import { createError, isAxiosError } from 'src/core/createError';
describe('src/core/createError.ts', () => {
test('应该支持空参数', () => {
const c = {};
const err = createError('error', c);
expect(err.isAxiosError).toBeTruthy();
expect(err.message).toBe('error');
expect(err.config).toBe(c);
expect(checkStack(err)).toBeTruthy();
@ -24,4 +23,10 @@ describe('src/core/createError.ts', () => {
expect(err.request).toBe(req);
expect(err.response).toBe(res);
});
test('应该正确判断 AxiosError', () => {
expect(isAxiosError(0)).toBeFalsy();
expect(isAxiosError(new Error())).toBeFalsy();
expect(isAxiosError(createError('error', {}))).toBeTruthy();
});
});