refactor(auth): 优化401处理逻辑并提取登录跳转函数

将重复的401处理逻辑提取为redirectToLogin函数
修复刷新接口401时的循环重试问题
docs: 更新项目结构文档和快速启动指南
This commit is contained in:
2025-12-15 23:46:36 +08:00
parent 12830b7cf6
commit cbbcd3121f
2 changed files with 96 additions and 12 deletions

View File

@ -63,11 +63,7 @@ async function tryRefreshAndRetry(original: RetryConfig, message?: string): Prom
} catch (e: any) {
pendingQueue.forEach(p => p.reject(e))
pendingQueue = []
clearToken()
if (typeof window !== 'undefined' && window.location.pathname !== '/login') {
window.location.href = '/login'
}
return Promise.reject(e)
return redirectToLogin((e && e.message) || message)
} finally {
isRefreshing = false
}
@ -104,6 +100,10 @@ api.interceptors.response.use(
const msg = body?.message || '未登录或登录已过期'
return Promise.reject(new Error(msg))
}
// 刷新接口返回业务 401直接跳转登录避免循环重试
if (reqUrl.includes('/auth/refresh')) {
return redirectToLogin(body?.message)
}
return tryRefreshAndRetry(original, body?.message)
}
return r
@ -120,6 +120,10 @@ api.interceptors.response.use(
const msg = resp?.message || '用户名或密码错误'
return Promise.reject(new Error(msg))
}
// 刷新接口返回 401直接跳转登录避免循环重试
if (reqUrl.includes('/auth/refresh')) {
return redirectToLogin(resp?.message)
}
// 已经重试过了,直接拒绝
if (original._retry) {
@ -144,14 +148,10 @@ api.interceptors.response.use(
pendingQueue = []
return api(original)
}
} catch (e) {
} catch (e: any) {
pendingQueue.forEach(p => p.reject(e))
pendingQueue = []
clearToken()
if (typeof window !== 'undefined' && window.location.pathname !== '/login') {
window.location.href = '/login'
}
return Promise.reject(e)
return redirectToLogin((e && e.message) || resp?.message)
} finally {
isRefreshing = false
}