@@ -3,6 +3,18 @@ import axios from 'axios'
33// import qs from 'qs'
44import { toast } from 'vue-sonner'
55
6+ // 请求重试配置
7+ const MAX_RETRY_COUNT = 3 // 最大重试次数
8+ const RETRY_DELAY = 1000 // 重试延迟时间(毫秒)
9+
10+ // 扩展 AxiosRequestConfig 类型
11+ declare module 'axios' {
12+ export interface AxiosRequestConfig {
13+ retry ?: boolean
14+ retryCount ?: number
15+ }
16+ }
17+
618const api = axios . create ( {
719 baseURL : ( import . meta. env . DEV && import . meta. env . VITE_OPEN_PROXY ) ? '/proxy/' : import . meta. env . VITE_APP_API_BASEURL ,
820 timeout : 1000 * 60 ,
@@ -29,6 +41,28 @@ api.interceptors.request.use(
2941 } ,
3042)
3143
44+ // 处理错误信息的函数
45+ function handleError ( error : any ) {
46+ if ( error . status === 401 ) {
47+ useUserStore ( ) . requestLogout ( )
48+ throw error
49+ }
50+ let message = error . message
51+ if ( message === 'Network Error' ) {
52+ message = '后端网络故障'
53+ }
54+ else if ( message . includes ( 'timeout' ) ) {
55+ message = '接口请求超时'
56+ }
57+ else if ( message . includes ( 'Request failed with status code' ) ) {
58+ message = `接口${ message . substr ( message . length - 3 ) } 异常`
59+ }
60+ toast . error ( 'Error' , {
61+ description : message ,
62+ } )
63+ return Promise . reject ( error )
64+ }
65+
3266api . interceptors . response . use (
3367 ( response ) => {
3468 /**
@@ -50,25 +84,31 @@ api.interceptors.response.use(
5084 }
5185 return Promise . resolve ( response . data )
5286 } ,
53- ( error ) => {
54- if ( error . status === 401 ) {
55- useUserStore ( ) . requestLogout ( )
56- throw error
57- }
58- let message = error . message
59- if ( message === 'Network Error' ) {
60- message = '后端网络故障'
61- }
62- else if ( message . includes ( 'timeout' ) ) {
63- message = '接口请求超时'
87+ async ( error ) => {
88+ // 获取请求配置
89+ const config = error . config
90+
91+ // 如果配置不存在或未启用重试,则直接处理错误
92+ if ( ! config || ! config . retry ) {
93+ return handleError ( error )
6494 }
65- else if ( message . includes ( 'Request failed with status code' ) ) {
66- message = `接口${ message . substr ( message . length - 3 ) } 异常`
95+
96+ // 设置重试次数
97+ config . retryCount = config . retryCount || 0
98+
99+ // 判断是否超过重试次数
100+ if ( config . retryCount >= MAX_RETRY_COUNT ) {
101+ return handleError ( error )
67102 }
68- toast . error ( 'Error' , {
69- description : message ,
70- } )
71- return Promise . reject ( error )
103+
104+ // 重试次数自增
105+ config . retryCount += 1
106+
107+ // 延迟重试
108+ await new Promise ( resolve => setTimeout ( resolve , RETRY_DELAY ) )
109+
110+ // 重新发起请求
111+ return api ( config )
72112 } ,
73113)
74114
0 commit comments