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

在Next.js App Router中使用MirageJS模拟接口遇404错误求助

在Next.js App Router中集中初始化MirageJS服务器

为啥Root Layout里直接初始化会失败?

Next.js App Router的Root Layout默认是服务器组件,而MirageJS是运行在浏览器端的Mock工具,直接在服务器组件里调用它,会因为环境不兼容报错。

解决办法:用客户端组件全局初始化

我们可以把MirageJS的初始化逻辑封装成一个客户端组件,然后在Root Layout里引入,这样就能实现全局复用,不用每个组件都单独初始化。

第一步:写个专门的初始化组件

在app/components/下面新建MirageInit.jsx:

'use client'

import { makeServer } from '@/path/to/your/server/file'

// 只在开发环境启动Mock服务,且只初始化一次
if (process.env.NODE_ENV === 'development') {
  makeServer({ environment: 'development' })
}

export default function MirageInit() {
  // 这个组件不用渲染任何东西
  return null
}

第二步:在Root Layout里引入它

修改你的app/layout.js,把刚才的组件加进去:

import MirageInit from './components/MirageInit'

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        {/* 全局加载MirageJS的初始化逻辑 */}
        <MirageInit />
        {children}
      </body>
    </html>
  )
}

第三步:修复组件里的渲染bug

你的Assets组件中,map函数没有返回元素,导致页面看不到内容,改一下:

'use client'

import { useState, useEffect } from "react"

export default function Assets(){
  const [assets, setAssets] = useState([])

  useEffect(() => {
    fetch("/api/movies")
      .then((res) => res.json())
      .then((json) => {
        setAssets(json.movies)
      })
  }, [])

  const assetElements = assets.map((asset, index) => (
    // 别忘了加key,避免React警告
    <div key={index}>
      <p>{asset.name}</p>
      <p>{asset.year}</p>
    </div>
  ))

  return (
    <>
      {assetElements}
    </>
  )
}

注意点

  • 必须加'use client':确保组件跑在浏览器里,MirageJS才能拦截fetch请求。
  • 环境判断:别在生产环境启动Mock服务,避免冗余代码。
  • 单例初始化:通过环境判断保证服务器只创建一次,不会重复实例化。

这样设置后,MirageJS会在应用启动时全局初始化,所有页面的请求都会被正确拦截,不用再每个组件单独写初始化代码了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:40:27