5月30日 00:10
axios 中如何进行错误处理?有哪些常见错误类型?
Axios 错误处理先看三类:error.response 表示服务端返回了非 2xx 状态码,重点处理 400、401、403、404、5xx;error.request 表示请求发出但没收到响应,多半是网络、超时、CORS;两者都没有通常是请求配置写错。实际项目里建议:业务层只处理当前页面关心的错误,全局拦截器统一做登录失效、错误提示、日志和重试。
追问
error.response 和 error.request 有什么区别?
response 说明后端有响应,只是状态码失败;request 说明请求发出去了但没有拿到响应。前者看 status 和 data.message,后者看 code,比如 ECONNABORTED 或 ERR_NETWORK。
401 应该在每个接口里处理吗?
不要。401 属于全局认证问题,放响应拦截器里统一清 token、跳登录页或刷新 token。页面里只关心业务错误,比如表单校验失败。
超时和 5xx 要不要自动重试?
可以,但只重试幂等请求,比如 GET。POST、支付、下单这类接口不能盲目重试,否则可能造成重复提交。
实际项目里最容易踩什么坑?
拦截器里 return Promise.reject(error) 忘了写,外层 catch 拿不到错误;另一个坑是把所有错误都弹 toast,导致 401 跳转时还弹一堆无意义提示。
写段代码
javascriptaxios.interceptors.response.use(r => r.data, error => { if (error.response) { const { status, data } = error.response; if (status === 401) { localStorage.removeItem('token'); location.href = '/login'; } return Promise.reject(new Error(data?.message || `HTTP ${status}`)); } if (error.code === 'ECONNABORTED') { return Promise.reject(new Error('请求超时')); } return Promise.reject(new Error(error.message || '网络错误')); });