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

NextJS服务端触发_error页面(404)但客户端正常渲染登录页的问题求助

排查Next.js中_error路由被静默触发的问题

看起来你遇到的是服务端渲染(SSR)阶段触发了_error页面,但客户端Hydrate后又正常显示原页面的诡异问题,结合你的日志和代码,我给你几个具体的排查方向:

1. 先抓准错误的具体来源

你的自定义_error页面已经拿到了404状态码,但还不够——把错误对象的详细信息打出来,这能直接帮你定位问题:

Error.getInitialProps = ({ res, err }) => {
  const statusCode = res ? res.statusCode : err ? err.statusCode : 404;
  console.log('触发_error的完整错误信息:', err); // 新增这行,看具体是啥错
  console.log('响应对象:', res);
  return { statusCode };
};

服务端控制台会输出错误的堆栈、请求路径等关键信息,比如是某个静态资源404,还是API请求失败,一目了然。

2. 排查SSR阶段的资源/请求问题

从日志看,服务端先处理了/login,然后突然跳到/_error,大概率是SSR过程中某个依赖的资源或请求返回了404:

  • 检查Navbar、CustomDrawer这些组件在SSR时有没有加载不存在的静态资源(比如图片、字体、样式文件),或者调用了不存在的API端点;
  • 你的GraphQL端点在pages/api里,有没有可能currentUser查询在SSR阶段被调用(比如某个全局组件里的useQuery),而未登录状态下这个查询返回了404?Next.js会捕获这种SSR时的请求错误,触发_error页面;
  • 如果用了自定义服务器,在服务器代码里加日志,记录所有请求的路径和状态码,看看哪个请求返回了404。

3. 检查Page组件的路由判断逻辑

你在Page组件里用router.route做了权限判断,但Next.js的router在SSR和客户端是有差异的:

  • 试试在useEffect里也打印router.route,看看客户端的路由状态是不是始终是/login,而服务端只是临时跳到/_error;
  • 暂时注释掉isLoggedOut里的router.route === '/_error'判断,看看是不是这个逻辑反过来触发了错误路由的渲染?

4. 排查第三方库的SSR兼容性

你用了framer-motion的AnimateSharedLayout,有些动画库在SSR时会有奇怪的行为:

  • 暂时去掉AnimateSharedLayout包裹,刷新页面看服务端日志还会不会出现/_error,排除动画库导致的SSR异常。

5. 检查页面的getServerSideProps/getInitialProps

如果你的/login或/register页面有getServerSideProps或getInitialProps:

  • 检查这些函数里有没有抛出错误,或者返回了notFound: true,这会直接触发404和_error页面;
  • 确认这些函数里的逻辑有没有在未登录状态下返回异常结果。

内容的提问来源于stack exchange,提问作者J. Jackson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:22:32