UMI 自定义错误处理方案[避免errorHandler无法拦截问题]
注意:如果不是硬性要求success,就没必要使用umi内置的那套 errorHandler。
export default {
baseURL: (REACT_APP_ENV === 'prod' && PROD_BASE_API_URL_API_URL) || '',
timeout: 30000,
// `validateStatus` defines whether to resolve or reject the promise for a given
// HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
// or `undefined`), the promise will be resolved; otherwise, the promise will be
// rejected.
validateStatus: function (status: number) {
// return true;
return status >= 200 && status < 300; // default
},
requestInterceptors: [],
responseInterceptors: [
[
(response: AxiosResponse) => {
return response;
},
(error: AxiosError) => {
/**
* 说明: 对接服务端API
* API方案:
* 1、错误定义对接服务端的API,规定业务错误响应状态码400,登录的401
* 2、其他状态码包括:500、404等一律按照非业务正常响应
*
* 服务端响应:
* 1、服务端响应体的内容统一为:{data,code,message},code同步为状态码
* 2、预定 PostBlogApi 为提交日志的接口
*
* umi request 处理
* 1、响应状态码正确时时(<300 && >=200),返回 Promise.resolve(response),
* 会执行 PostBlogApi.then(res),res为 response.data
*
* 2、响应状态为错误时(>=200 && <300),返回 Promise.reject(response?.data),
* 会执行 PostBlogApi.catch(res),res为 response.data,所以可以把业务错误放在data
* 里面,供业务逻辑消遣
*
* 建议:既然约定了400为业务错误返回,那应该确保服务端返回的业务错误必须为400,不要搞特殊返回
*/
console.log('响应错误: ', error);
const { response } = error;
if (response) {
const data: any = response?.data;
if (response.status === 400) {
return Promise.reject(error);
} else if (response.status === 401) {
history.push(LOGIN_PATH);
} else if (response?.data && typeof response.data === 'string') {
message.error(response.data);
} else if (data?.message) {
message.error(data.message);
} else {
message.error(response.statusText);
}
return Promise.reject(error);
} else {
message.error('响应失败');
console.log('error not found response: ');
return Promise.reject(error);
}
},
],
],
};