Next.js не отправляет файлы cookie с запросом на выборку, даже если включены учетные данные

Я работаю над приложением Next.js, которое изначально было обычным приложением для реагирования (созданным с помощью приложения create-react-app), и я пытаюсь отправить файлы cookie с запросом на выборку на мой сервер. Однако файлы cookie не отправляются, хотя я установил учетные данные: «включить» в моих параметрах выборки.

Точно такой же код работает в «не» приложении Next js.

Я также включил опцию «использовать клиент». Файлы находятся в новой папке «приложение» из следующей версии 13.

ОБНОВЛЕНИЕ 1: Вот какой код я использовал:

async function getToken() {
  const res = await fetch(
    'http://localhost:8080/api/auth/token', {
      credentials: 'include'
    }
  );
  if (!res.ok) {
    return null;
  }
  return res.json();
}

export default async function Component({
  children
}) {

  const tokenData = getToken();
  const token = await tokenData;

  /* some other code */

  return {
    children
  }
}

ОБНОВЛЕНИЕ 2. Основываясь на информации, полученной от edgefish, и дальнейших экспериментах, я признаю, что в версиях Next.js до 12 можно использовать такие методы, как getServerSideProps. Однако с момента появления папки «приложение» в Next.js 13 эти методы больше не работают в самой папке «приложение» (см. эту ссылку ). Мне любопытно узнать, есть ли способ включить файлы cookie в запрос на выборку в Next.js 13 с использованием компонента на стороне сервера. Хотя можно получить файл cookie, отправленный клиентом, с помощью метода файлов cookie (см. эту ссылку), я не знаю, как включить этот файл cookie в последующий запрос на выборку. Обратите внимание, что использование учетных данных: 'include' неэффективно, если компонент является компонентом сервера.

Может быть полезно опубликовать фрагмент кода, который вызывает у вас затруднения.

Igor Danchenko 17.05.2023 19:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
183
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите отправить учетные данные для получения в проекте nextjs, Вы должны использовать рендеринг на стороне клиента (CSR)

import useSWR from 'swr';

const fetcher = (url: string) => fetch(url).then((res) => res.json());
const YourPage = () => {
  const { data, error, isLoading } = useSWR(`https://.../data`, fetcher);

   return (
     <div>{JSON.stringify(data)}</div>
   );

};

ИЛИ

Если вы хотите рендеринга на стороне сервера (SSR).

Вы можете использовать проект getServerSideProps в nextjs, вы можете поставить лайк...

import type { GetServerSidePropsContext } from 'next';

export async function getServerSideProps(context: GetServerSidePropsContext) {
  const { cookie } = context.req.headers;

  // Fetch data from external API
  const res = await fetch(`https://.../data`, {
    headers: { Cookie: cookie },
  });

  const data = await res.json();

  // Pass data to the page
  return { props: { data } };
}

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

Чтобы включить файлы cookie в Next 13 на стороне сервера:

  1. Прочитайте файлы cookie запроса с помощью функции cookie.

  2. Добавьте заголовок Cookie в запрос на выборку на стороне сервера.

import { cookies } from "next/headers";

async function getData() {
  const response = await fetch(process.env.API_ENDPOINT, {
    headers: {
      Cookie: cookies()
        .getAll()
        .map(({ name, value }) => `${name}=${value}`)
        .join("; "),
    },
  });
  return await response.json();
}

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