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

NextJS(AppRouter)中使用ApolloProvider根布局报错问题

问题:在Next.js根布局中使用ApolloProvider报错“Context is not available in this environment”

我尝试在Next.js的根布局中用ApolloProvider包裹所有页面,以便所有页面都能使用GraphQL,但将ApolloProvider包裹在children组件外时出现错误。

错误信息

⨯ node_modules\rehackt\rsc.js (36:12) @ throwNoContext
⨯ Error: Context is not available in this environment.
at stringify ()
digest: "1025442082"
null

相关代码

apolloClient.js

import { ApolloClient, InMemoryCache } from "@apollo/client";

let apolloClient;

const getApolloClient = () => {
  if (apolloClient == null){
    apolloClient = new ApolloClient({
      uri: "http://localhost:3000/api/graphql",
      cache: new InMemoryCache(),
    });
  }
  return apolloClient
};

export default getApolloClient;

layout.js

import { ApolloProvider } from "@apollo/client";
import getApolloClient from "@/db/apolloClient";

export default async function RootLayout({ children }) {

  const session = await getServerSession();
  const apolloClient = getApolloClient();

  return (
    <html lang="en" suppressHydrationWarning={true}>
      <body className={inter.className}>
      <ApolloProvider client={apolloClient}>
         {children}
      </ApolloProvider>
      </body>
    </html>
  );
}

解决方案

错误原因是Next.js App Router的根布局默认是Server Component,而ApolloProvider依赖React Context,只能在Client Component中运行。解决步骤如下:

  1. 封装ApolloProvider为Client Component
    创建一个新的组件文件(比如components/apollo-provider.jsx),添加'use client'指令:
'use client';

import { ApolloProvider } from "@apollo/client";
import getApolloClient from "@/db/apolloClient";

export default function ApolloClientProvider({ children }) {
  const client = getApolloClient();
  return <ApolloProvider client={client}>{children}</ApolloProvider>;
}
  1. 修改根布局使用封装后的组件
    更新layout.js,替换直接使用的ApolloProvider为上面封装的Client Component:
import ApolloClientProvider from "@/components/apollo-provider";
import { getServerSession } from "next-auth/next";

export default async function RootLayout({ children }) {
  const session = await getServerSession();

  return (
    <html lang="en" suppressHydrationWarning={true}>
      <body className={inter.className}>
        <ApolloClientProvider>
          {children}
        </ApolloClientProvider>
      </body>
    </html>
  );
}

这样调整后,ApolloProvider会在客户端环境中运行,React Context就能正常工作,不会再出现环境不兼容的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:48:20