Невозможно настроить Next.js 14 с помощью клиента Apollo GraphQL

Я новичок в Next.js и GraphQL, мне нужно работать над проектом, используя оба. Итак, пытаемся настроить фиктивный проект с помощью Next.js(JavaScript, React), клиента Apollo, сервера Apollo. Серверная часть запущена и работает без проблем. Но клиентская сторона не может загружать данные Apollo Server в пользовательский интерфейс. Мне удалось создать базовый вызов API со стороны клиента и загрузить данные, но не удалось выполнить их рендеринг с помощью ApolloProvider/ApolloWrapper.

Я пытался следовать многим статьям, доступным в Интернете, но ни одна из них не сработала. Последний вариант, который выглядел многообещающе и просто, но написан для TypeScript — Medium Article и Repo. Я пытался следовать этому, но все равно получаю ошибку ниже:

Сообщение об ошибке

src/app/layout.js

import { Inter } from "next/font/google";
import "./globals.css";
import { ApolloProvider } from "@apollo/client";
// import { ApolloWrapper } from "../lib/apollo-wrapper";
import client from "../lib/client";


const inter = Inter({ subsets: ["latin"] });

export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({ children }) {
  return (
      <html lang = "en">
        <body className = {inter.className}>
          <ApolloProvider client = {client}>{children}</ApolloProvider>
        </body>
      </html>
  );
}

src/lib/client.js

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

const httpLink = new HttpLink({
  uri: '/'
})

const client = new ApolloClient({
    cache: new InMemoryCache(),
    uri: "http://localhost:4000/",
    link: from([httpLink])
  });
  
export default client;

Dependencies from package.json

  "dependencies": {
    "@apollo/client": "^3.9.0-rc.1",
    "@apollo/experimental-nextjs-app-support": "^0.8.0",
    "graphql": "^16.8.1",
    "next": "14.1.0",
    "react": "^18",
    "react-dom": "^18"
  },
  "devDependencies": {
    "autoprefixer": "^10.0.1",
    "eslint": "^8",
    "eslint-config-next": "14.1.0",
    "postcss": "^8",
    "tailwindcss": "^3.3.0"
  }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 990
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите использовать клиент Apollo с App Router, вам необходимо использовать его с библиотекой @apollo/experimental-nextjs-app-support. См. этот пост — NextJS (AppRouter), Apollo (Клиент), ошибка при использовании ApolloProvider в корневом макете

Похоже, вы добавили @apollo/experimental-nextjs-app-support в свои зависимости, но вообще не использовали его. Кроме того, возможно, вашу библиотеку @apollo/client необходимо обновить до последней версии — npm install @apollo/client@latest

Чтобы обернуть RootLayoutApolloProvider, попробуйте выполнить следующее (подробнее см. https://www.npmjs.com/package/@apollo/experimental-nextjs-app-support):

Сначала создайте новый файл src/app/ApolloWrapper.jsx:

"use client";

import { ApolloLink, HttpLink } from "@apollo/client";
import {
  ApolloNextAppProvider,
  NextSSRInMemoryCache,
  NextSSRApolloClient,
  SSRMultipartLink,
} from "@apollo/experimental-nextjs-app-support/ssr";

function makeClient() {
  const httpLink = new HttpLink({
    uri: "http://localhost:4000/api/graphql",
    fetchOptions: { cache: "no-store" },
  });

  return new NextSSRApolloClient({
    cache: new NextSSRInMemoryCache(),
    link:
      typeof window === "undefined"
        ? ApolloLink.from([
            new SSRMultipartLink({
              stripDefer: true,
            }),
            httpLink,
          ])
        : httpLink,
  });
}

export function ApolloWrapper({ children }) {
  return (
    <ApolloNextAppProvider makeClient = {makeClient}>
      {children}
    </ApolloNextAppProvider>
  );
}

Теперь вы можете обернуть RootLayout в этот компонент-обертку в файле src/app/layout.js:

import { Inter } from "next/font/google";
import "./globals.css";
import { ApolloWrapper } from "./ApolloWrapper";

const inter = Inter({ subsets: ["latin"] });

export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({ children }) {
  return (
    <html lang = "en">
      <body>
        <ApolloWrapper>{children}</ApolloWrapper>
      </body>
    </html>
  );
}

Другие вопросы по теме

Похожие вопросы

Получение ошибки, если функция стрелки возвращает функцию, но не когда она возвращает значение null для useEffect
Когда я загружаю элементы холста Fabric.js из JSON, они не видны на холсте
React (18.2.0) меняет URL-адрес с помощью навигации, но страница не обновляется
Получение модуля «реагировать-маршрутизатор-дом» не имеет экспортированного члена. Ошибка RouteComponentProps при переходе на реактивный маршрутизатор v6
При использовании PDF React Renderer изображения не отображаются при загрузке
Принудительно использовать то же имя импортированного компонента, что и файл, из которого он импортирован, в ответ на импорт модулей TS?
Есть ли способ решить проблему комбинации маршрутов, которые влияют друг на друга?
Как отобразить --- как emdash в реакции-уценке? и многоточие...? и открытые/закрытые котировки?
Проблема с предупреждением о гидратации Prime React и Next.js
Как рассчитать общее поле и установить его в данные с помощью формы крючка?