47 lines
989 B
TypeScript
47 lines
989 B
TypeScript
/**
|
||
* API错误处理
|
||
*/
|
||
import type { AxiosError } from 'axios';
|
||
|
||
/**
|
||
* API错误接口
|
||
*/
|
||
export interface IApiError {
|
||
code: number;
|
||
message: string;
|
||
details?: unknown;
|
||
}
|
||
|
||
/**
|
||
* API错误类(诶,就是要自定义)
|
||
*/
|
||
export class ApiError extends Error implements IApiError {
|
||
public readonly code: number;
|
||
public readonly details: unknown;
|
||
|
||
constructor(code: number, message: string, details?: unknown) {
|
||
super(message);
|
||
this.name = 'ApiError';
|
||
this.code = code;
|
||
this.details = details;
|
||
}
|
||
|
||
/**
|
||
* 从Axios错误创建API错误(就是为了简化)
|
||
*/
|
||
static fromAxiosError(error: AxiosError): ApiError {
|
||
if (!error.response) {
|
||
return new ApiError(0, error.message || '网络错误');
|
||
}
|
||
|
||
const { status, data } = error.response;
|
||
const message = data && typeof data === 'object' && 'message' in data
|
||
? data.message as string
|
||
: '请求失败';
|
||
|
||
return new ApiError(status, message, data);
|
||
}
|
||
}
|
||
|
||
|