ROUTING_DEBUG_REPORT.md 4.2 KB

🔍 路由重定向问题深度诊断报告

问题: 访问 /chat-test 仍然被重定向到 /login
诊断时间: 2026-04-10 15:50


📊 当前配置状态

1. 路由配置 ✅

// commonRoutes 中包含 /chat-test
{
    path: '/chat-test',
    element: lazyLoad(() => import('@/pages/test/ChatTestPage.tsx')),
}

2. 白名单配置 ✅

const whiteList = ['/login', '/chat-test', '/help', '/mobile-test', '/universalChat'];

3. 路由守卫逻辑 ✅

// 第 207-208 行
if (whiteList.includes(path)) {
    return <>{component}</>  // 应该直接返回组件
}

🔍 可能的问题点

问题点 1: 路由匹配优先级 ❓

现状:

const router = createBrowserRouter([...routerList, ...commonRoutes]);

分析:

  • routerList 在前,commonRoutes 在后
  • routerList 包含根路径 /index: true 重定向
  • 可能导致 /chat-test 被根路径逻辑拦截

验证方法:

  1. 打开浏览器控制台
  2. 访问 http://localhost:3100/chat-test
  3. 查看调试日志中的 path

问题点 2: RouterComponent 未正确执行 ❓

分析:

  • 所有路由都被添加了 RouterComponent 包装
  • 如果白名单检查逻辑未执行,会进入 else 分支
  • 导致重定向到 /login

验证方法:

  1. 查看控制台是否有 🔍 RouterComponent 被调用 日志
  2. 检查 isWhiteList 是否为 true

问题点 3: 其他路由守卫 ❓

可能位置:

  • src/pages/layout/index.tsx - 布局组件
  • src/App.tsx - 应用根组件
  • src/main.tsx - 入口文件
  • 其他 HOC 或中间件

排查结果:

  • App.tsx - 无守卫逻辑
  • main.tsx - 无守卫逻辑
  • layout/index.tsx - 待检查

问题点 4: LocalStorage 自动清除 ❓

分析:

  • LocalStorage.getToken() 可能返回 undefined
  • 导致进入未登录分支

验证方法:

  1. 访问测试页面前,在控制台执行:

    localStorage.setItem('token', 'test-token');
    
  2. 刷新页面,观察是否仍然重定向


🛠️ 调试工具

1. 调试页面

访问:http://localhost:3100/debug (待添加路由)

功能:

  • 显示当前路由信息
  • 显示 localStorage 状态
  • 提供测试操作按钮

2. 控制台日志

已添加的调试日志:

console.log('🔍 RouterComponent 被调用:', {
    path,
    whiteList,
    isWhiteList: whiteList.includes(path),
    hasToken: !!LocalStorage.getToken(),
    hasUserInfo: !!localStorage.getItem('userInfo'),
});

📋 诊断步骤

步骤 1: 清除浏览器缓存

# 在浏览器中
Ctrl + Shift + Delete (Windows)
Cmd + Shift + Delete (Mac)

步骤 2: 清除 Vite 缓存

rm -rf node_modules/.vite

步骤 3: 重启开发服务器

# 停止当前服务器
Ctrl + C

# 重新启动
npm run dev

步骤 4: 访问测试页面并查看控制台

  1. 访问 http://localhost:3100/chat-test
  2. 打开浏览器控制台 (F12)
  3. 查看 🔍 RouterComponent 日志
  4. 记录以下信息:
    • path 的值
    • isWhiteList 是否为 true
    • hasTokenhasUserInfo 的值

🎯 解决方案

方案 A: 调整路由顺序 (推荐)

// 将 commonRoutes 放在前面
const router = createBrowserRouter([...commonRoutes, ...routerList]);

方案 B: 在 RouterComponent 开头直接返回

// 测试页面直接返回,不经过登录检查
if (path === '/chat-test') {
    console.log('✅ 测试页面,直接返回');
    return <>{component}</>;
}

方案 C: 完全禁用路由守卫 (临时)

// 注释掉整个 RouterComponent 逻辑
route.element = component; // 直接返回组件,不包装

📝 等待用户反馈

请执行以下操作:

  1. ✅ 清除缓存并重启服务器
  2. ✅ 访问 http://localhost:3100/chat-test
  3. ✅ 打开浏览器控制台
  4. ✅ 复制 🔍 RouterComponent 日志内容
  5. ✅ 告诉我日志中的 pathisWhiteList

根据日志内容, 我可以精确定位问题所在!


诊断报告生成完毕 - 等待用户反馈调试日志