umijs / umi-request

A request tool based on fetch.
2.2k stars 336 forks source link

什么时候会会进入errorHandler?? #281

Open cosmosdawn opened 2 years ago

cosmosdawn commented 2 years ago

你好,我想问一下到底会在什么情况下代码才会进入errorHandler执行? 我开始理解的是httpcode 不等于200的情况下会进入errorHandler,但是经过我实验,在断网的情况下,发起网络请求,httpcode 返回的是504的情况下,依然进入了响应拦截器里面,并没有进入errorHandler,而且我发现,我在响应拦截器里面将响应reject出去后,会进入errorHandler执行。 所以,umi-request的errorHandler,到底是在什么情况下才会执行呢?

下面是我的代码: fetch.js image config.ts ` import { message } from 'antd'; import { history } from '@@/core/history';

type CodeMsg = {

};

// 错误状态码字典(httpcode) const codeMessage: CodeMsg = { 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 401: 'token过期,请重新登录', 403: '用户得到授权,但是访问是被禁止的。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 406: '请求的格式不可得。', 500: '服务器发生错误,请检查服务器。', 502: '网关错误。', 503: '服务不可用,服务器暂时过载或维护。', 504: '网关超时。', };

// 错误处理(httpcode !== 2xx的case) const errorHandler = (error: { response: Response }): Response => { console.log('进入errorHandler', error); const { response } = error; if (response && response.status) { const errorText = codeMessage[response.status] || response.statusText; const { status } = response; if (status === 401) { localStorage.clear(); sessionStorage.clear(); message.destroy(); message.error('token过期,请重新登录', 1); history.push('/'); } else { message.destroy(); message.error(errorText, 1.5); } } else { message.destroy(); message.error('网络发生异常无法连接服务器', 1); } throw error; // return response; };

// 请求拦截 const reqInterceptors = (url: string, options: any) => { const token = localStorage.getItem('Msp_token'); if (token) { const headers = { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json', token, }; return { url, options: { ...options, headers } }; } return { url, options }; };

// 响应拦截 const resInterceptors = async (response: any) => { console.log('进入响应拦截', response); if (response) { if (response.status === 200 && response.ok) { // 网路通,正常情况(请求层状态码不可变) let businessLevelResponse = await response.clone().json(); // 业务json console.log('businessLevelResponse', businessLevelResponse); if (businessLevelResponse.code && businessLevelResponse.code === 200) { // 与后端约定好业务层code // 业务层正常返回情况 return new Promise((resolve, reject) => { // 所有接口要求后端统一改!!! {code: 200, data: {}, message: '' } resolve(businessLevelResponse.user); // resolve(businessLevelResponse.data); }) } else { // 业务层异常情况处理 if (businessLevelResponse) { console.log('业务层异常情况', businessLevelResponse) message.info(businessLevelResponse.message); // return new Promise((resolve, reject) => { // // 会进入errorHandler // reject(businessLevelResponse); // }) } else { message.info('接口异常'); // return new Promise((resolve, reject) => { // reject({message: '接口异常'}); // }) } } } else { message.info(response.statusText); // 网络层异常 // message.info('网络异常'); // return new Promise((resolve, reject) => { // reject({message: '网络异常'}); // }) } } else { message.info('请求没有返回可用的响应信息'); // 没有返回Response 对象的情况 } };

export { errorHandler, reqInterceptors, resInterceptors };

`

wang-yi-bit64 commented 2 years ago

你可以试一下 只要是接口错误 好像都是会 走 errorHandler 这一步

hanalice commented 2 years ago

当requestInterceptor, middlewares,responseInterceptor 中任意一个出问题都会进入errorHandler,可能是网络错误也可能是js代码执行错误或者其他未知的不能处理的错误。