diff --git a/src/api/request.ts b/src/api/request.ts index c42ab83..0a8ac57 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -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)