diff --git a/src/api/request.ts b/src/api/request.ts index 8f37dbfc..63e1826e 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -26,6 +26,18 @@ export interface RequestConfig extends AxiosRequestConfig { export const isRelogin = { show: false }; +type HandledRequestError = Error & { isHandled?: boolean }; + +function createHandledError(message: string) { + const error = new Error(message) as HandledRequestError; + error.isHandled = true; + return error; +} + +export function isHandledRequestError(error: unknown) { + return Boolean((error as { isHandled?: boolean } | undefined)?.isHandled); +} + export function globalHeaders() { return { Authorization: `Bearer ${getToken() || ''}`, @@ -196,7 +208,7 @@ service.interceptors.response.use( } }); } - return Promise.reject(new Error('无效的会话,或者会话已过期,请重新登录。')); + return Promise.reject(createHandledError('无效的会话,或者会话已过期,请重新登录。')); } if (code === SERVER_ERROR || code === WARN || code !== SUCCESS) { diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index 4d22241a..480ed2f8 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -10,6 +10,7 @@ import dayjs from 'dayjs'; import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import type { RuntimeMenuItem } from '@/api/types'; import { logout } from '@/api/login'; +import { isHandledRequestError } from '@/api/request'; import defaultAvatar from '@/assets/images/profile.jpg'; import appLogo from '@/assets/logo/logo.png'; import ExternalLinkButton from '@/components/layout/ExternalLinkButton'; @@ -81,7 +82,9 @@ export default function BasicLayout() { } }) .catch(error => { - message.error(error.message || '加载用户信息失败'); + if (!isHandledRequestError(error)) { + message.error(error.message || '加载用户信息失败'); + } closePush(); pushStartedRef.current = false; removeToken();