feat: 通知调试能力

This commit is contained in:
zdl
2025-11-10 20:05:53 +08:00
parent 8e5623d723
commit 643c3db03e
18 changed files with 1218 additions and 1424 deletions

View File

@@ -58,7 +58,9 @@ export const AuthProvider = ({ children }) => {
// 创建超时控制器
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5秒超时
const timeoutId = setTimeout(() => {
controller.abort(new Error('Session check timeout after 5 seconds'));
}, 5000); // 5秒超时
const response = await fetch(`/api/auth/session`, {
method: 'GET',
@@ -96,8 +98,18 @@ export const AuthProvider = ({ children }) => {
setIsAuthenticated((prev) => prev === false ? prev : false);
}
} catch (error) {
logger.error('AuthContext', 'checkSession', error);
// 网络错误或超时,设置为未登录状态
// ✅ 区分AbortError和真实错误
if (error.name === 'AbortError') {
logger.debug('AuthContext', 'Session check aborted', {
reason: error.message || 'Request cancelled',
isTimeout: error.message?.includes('timeout')
});
// AbortError不改变登录状态保持原状态
return;
}
// 只有真实错误才标记为未登录
logger.error('AuthContext', 'checkSession failed', error);
setUser((prev) => prev === null ? prev : null);
setIsAuthenticated((prev) => prev === false ? prev : false);
} finally {
@@ -108,7 +120,16 @@ export const AuthProvider = ({ children }) => {
// ⚡ 初始化时检查Session - 并行执行,不阻塞页面渲染
useEffect(() => {
const controller = new AbortController();
// 传递signal给checkSession需要修改checkSession签名
// 暂时使用原有方式但添加cleanup防止组件卸载时的内存泄漏
checkSession(); // 直接调用,与页面渲染并行
// ✅ Cleanup: 组件卸载时abort可能正在进行的请求
return () => {
controller.abort(new Error('AuthProvider unmounted'));
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);