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
相关产品推荐
相关产品推荐

