fix(request): 401 可读 JSON 的 msg 附加到 error.message

- 后端 401 均返回 {code, msg} 可读 JSON(如 Mail/Login 的"邮箱或密码错误"),
  拦截器此前在 silent 场景原样 reject,调用方只看到 HTTP 状态文本
- 现在统一提取响应体 msg 覆盖到 error.message,silent 与普通调用都能拿到后端文案
This commit is contained in:
TermiNexus committed 2026-08-11 01:03:34 +08:00
1 parent 4f4508083c
commit 716cddb9e8
1 file changed
+12 -2
+12 -2
View File
@@ -88,7 +88,17 @@ request.interceptors.response.use(
(error) => {
const status = error?.response?.status
const url: string = error?.config?.url || ''
// 静默模式:调用方自行处理失败(如登录页会话恢复),不弹全局提示
// 后端可读业务 JSON({code, msg}):提取 msg 附加到 error.message,
// 保证 silent 调用方与各处 catch 的 (e as Error).message 都能拿到友好文案
// (如 Mail/Login 401 返回 {"code":1,"msg":"邮箱或密码错误"},
// 而不是 axios 默认的 "Request failed with status code 401")
const bizData = error?.response?.data as { code?: number; msg?: string } | undefined
const bizMsg =
bizData && typeof bizData === 'object' && typeof bizData.msg === 'string' && bizData.msg
? bizData.msg
: ''
if (bizMsg) error.message = bizMsg
// 静默模式:调用方自行处理失败(如登录页会话恢复、邮箱登录/JMAP),不弹全局提示
const silent = (error?.config as InternalAxiosRequestConfig | undefined)?.silent === true
if (silent) {
return Promise.reject(error)
@@ -99,7 +109,7 @@ request.interceptors.response.use(
if (status === CODE_UNAUTHORIZED && !isLoginRequest) {
handleLoginExpired()
} else {
const msg = error?.response?.data?.msg || error?.message || '网络错误'
const msg = bizMsg || error?.message || '网络错误'
ElMessage.error(msg)
}
return Promise.reject(error)