@IIITRIX

Как получить файлы cookie в NextJs 13 при рендеринге на стороне сервера?

С выходом версии next13 появилась возможность использовать appDir
в next12 чтобы использовать полученные данные на всех страницах можно было сделать так

App.getInitialProps = async (ctx: AppContext) => {
  let user = null;
  const props = await App.getInitialProps(ctx);
  try {
    if (typeof window === 'undefined' && ctx.ctx.req?.headers.cookie) {
      axios.defaults.headers.get.Cookie = ctx.ctx.req?.headers.cookie;
      if (!ctx.ctx.req?.url?.startsWith('/_next/data')) {
        const res = await axios.get('/api/user/me');
        user = res.data.user;
      }
    }
  } catch (err: any) {
    if (err.response && err.response.status === 403) {
      ctx.ctx.res?.setHeader(
        'Set-Cookie',
        `app_session=; Domain=${process.env.DOMAIN}; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; Secure`,
      );
    }
  }
  return { user, ...props }
}

<UserProvider user={user}>{children}</UserProvider>

в next13 так сделать нельзя

Правильно ли будет если в новом общем layout сделать так:

async function getUser() {
  const sessionCookie = cookies().get('app_session')?.value
  if (sessionCookie === undefined) return null
  const res = await fetch(`http://localhost:8000/api/user/me`, {
    next: { revalidate: 10 },
    headers: {
      cookie: `app_session=${sessionCookie}`
    }
  })
  const user = (await res.json()) as User | null
  return user
}

export default async function RootLayout({children}: {children: React.ReactNode}) {
  const user = await getUser()

  return (
    <html lang='ru'>
      <body>
        <UserProvider user={user}>
              {children}
        </UserProvider>
      </body>
    </html>
  )
}
  • Вопрос задан
  • 668 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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