You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router 6与MirageJS配合时重定向报错问题排查

React Router 6 + MirageJS 重定向报错问题解析

问题场景

在开发Vanlife应用(基于React Router 6课程)时,使用路由保护工具函数实现未登录重定向,原本功能正常,但引入MirageJS后出现重定向报错。

相关代码如下:

路由保护工具函数(util.js)

import { redirect } from "react-router";
export async function requireAuth() { 
    const isLoggedIn = false; 
    if (!isLoggedIn) { 
        throw redirect("/login");     
    }
}

App.jsx 路由配置

import { requireAuth } from "./utils";

export default function App(){
const router = createBrowserRouter(createRoutesFromElements(
    <Route path="/" element={<Layout />}>
        <Route path="login" element={<Login />} />
        <Route path="host" element={<HostLayout />}>  
             <Route loader={async () => await requireAuth()} index element={<Dashboard/>}/> 
        </Route> 
    </Route> 
))}

引入MirageJS后触发错误:
重定向报错截图

原因分析

MirageJS默认会拦截所有浏览器发起的fetch请求,包括React Router内部用于处理导航、重定向的底层请求。这导致requireAuth中抛出的redirect异常无法被React Router的路由系统正确捕获和处理,进而触发错误边界报错。

解决方案

配置MirageJS仅拦截你需要模拟的API请求,排除React Router的路由导航请求。通过passthrough方法让非API路径的请求直接绕过Mirage拦截:

import { createServer } from "miragejs";

createServer({
  routes() {
    // 示例1:指定允许通过的路由路径(根据你的实际路由调整)
    this.passthrough("/login", "/host", "/host/**");
    
    // 示例2:更通用的方式,只拦截/api开头的API请求
    this.passthrough(request => !request.url.startsWith("/api"));
    
    // 你的Mirage API路由定义...
    this.get("/api/vans", () => {
      // 返回模拟数据
    });
  }
});

这样配置后,React Router的重定向导航请求不会被Mirage拦截,redirect抛出的异常能被路由系统正常处理,完成未登录跳转到登录页的逻辑。


内容的提问来源于stack exchange,提问作者SimoneMass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:27:25