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, 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);
}, },

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;
}

View File

@ -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);

View File

@ -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) => {

View File

@ -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();
});
}); });