Next.js构建时ApolloError动态服务器使用问题排查求助
Next.js 预渲染报错问题排查
执行yarn build时,在Generating static pages阶段,/partners/partner-with-us页面预渲染报错:
Error occurred prerendering page "/partners/partner-with-us". Read more: https://nextjs.org/docs/messages/prerender-error ApolloError: Dynamic server usage: Route /partners/partner-with-us couldn't be rendered statically because it used revalidate: 0 fetch http://localhost:4001 /partners/partner-with-us. See more info here: https://nextjs.org/docs/messages/dynamic-server-error
该页面代码仅返回简单内容:
const PartnerWithUs = () => { return <>test</> } export default PartnerWithUs
项目使用Apollo Graphql获取其他页面数据,主布局中通过<ApolloWrapper>包裹所有子页面。现需解答以下疑问:
- 为何该基础HTML页面会请求后端?
- 是否确实在访问后端地址
http://localhost:4001/partners/partner-with-us? - 报错提及的
revalidate:0配置在哪里? - 该ApolloError是否属于GraphQL相关错误?
问题解答
- 问题出在全局的
<ApolloWrapper>上。当前页面虽未主动编写GraphQL请求,但Apollo客户端的初始化逻辑(比如Wrapper内执行的服务端渲染逻辑、客户端启动时的默认查询或缓存同步操作)可能自动发起请求,或者Next.js预渲染时会执行Wrapper里的服务端代码,进而触发后端请求。 - 是。报错信息明确标注了请求地址,说明预渲染过程中确实发起了对
http://localhost:4001/partners/partner-with-us的请求,大概率是Apollo客户端的自动行为触发,比如尝试拉取路由匹配的默认数据、或是Wrapper内的全局查询逻辑作用到了当前页面。 revalidate:0的来源有几种可能:- 项目全局配置中设置了
revalidate:0(比如next.config.js里的默认静态属性配置) - Apollo客户端的请求配置默认携带
revalidate:0,导致对应的fetch请求带上了该参数 - 当前页面未手动设置,但父布局或ApolloWrapper内的
getStaticProps/getServerSideProps配置了revalidate:0,被当前页面继承
- 项目全局配置中设置了
- 属于GraphQL相关错误。这个
ApolloError是Apollo客户端抛出的,虽然报错表现为Next.js的动态服务使用限制问题,但根源是Apollo客户端在预渲染时发起了带有revalidate:0的请求,触发了Next.js的静态渲染规则限制,本质是Apollo客户端的请求逻辑导致的错误。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

