cookies

Функция cookies позволяет читать входящие HTTP-куки в Серверном Компоненте (Server Component) или записывать исходящие куки в Серверном Действии (Server Action) или Обработчике Маршрута (Route Handler).

Важно знать: cookies() — это Динамическая Функция (Dynamic Function), возвращаемые значения которой невозможно предсказать заранее. Использование в layout или page переведёт маршрут в режим динамического рендеринга (dynamic rendering) во время запроса.

cookies().get(name)

Метод, принимающий имя куки и возвращающий объект с именем и значением. Если куки с указанным name не найдены, возвращает undefined. При наличии нескольких совпадений вернёт только первое.

app/page.js
import { cookies } from 'next/headers'

export default function Page() {
  const cookieStore = cookies()
  const theme = cookieStore.get('theme')
  return '...'
}

cookies().getAll()

Метод, аналогичный get, но возвращающий список всех куки с совпадающим name. Если name не указан, возвращает все доступные куки.

app/page.js
import { cookies } from 'next/headers'

export default function Page() {
  const cookieStore = cookies()
  return cookieStore.getAll().map((cookie) => (
    <div key={cookie.name}>
      <p>Имя: {cookie.name}</p>
      <p>Значение: {cookie.value}</p>
    </div>
  ))
}

cookies().has(name)

Метод, принимающий имя куки и возвращающий boolean в зависимости от наличия (true) или отсутствия (false) куки.

app/page.js
import { cookies } from 'next/headers'

export default function Page() {
  const cookieStore = cookies()
  const hasCookie = cookieStore.has('theme')
  return '...'
}

cookies().set(name, value, options)

Метод, принимающий имя куки, значение и параметры, и устанавливающий исходящий куки.

Важно знать: HTTP не позволяет устанавливать куки после начала потоковой передачи, поэтому .set() можно использовать только в Серверном Действии (Server Action) или Обработчике Маршрута (Route Handler).

app/actions.js
'use server'

import { cookies } from 'next/headers'

async function create(data) {
  cookies().set('name', 'lee')
  // или
  cookies().set('name', 'lee', { secure: true })
  // или
  cookies().set({
    name: 'name',
    value: 'lee',
    httpOnly: true,
    path: '/',
  })
}

Удаление куки

Важно знать: Удалять куки можно только в Серверном Действии (Server Action) или Обработчике Маршрута (Route Handler).

Существует несколько способов удаления куки:

cookies().delete(name)

Явное удаление куки по имени.

app/actions.js
'use server'

import { cookies } from 'next/headers'

async function delete(data) {
  cookies().delete('name')
}

cookies().set(name, '')

Альтернативный способ — установка нового куки с тем же именем и пустым значением.

app/actions.js
'use server'

import { cookies } from 'next/headers'

async function delete(data) {
  cookies().set('name', '')
}

Важно знать: .set() доступен только в Серверном Действии (Server Action) или Обработчике Маршрута (Route Handler).

cookies().set(name, value, { maxAge: 0 })

Установка maxAge в 0 немедленно сделает куки недействительным.

app/actions.js
'use server'

import { cookies } from 'next/headers'

async function delete(data) {
  cookies().set('name', 'value', { maxAge: 0 })
}

cookies().set(name, value, { expires: timestamp })

Установка expires на любое прошедшее время немедленно сделает куки недействительным.

app/actions.js
'use server'

import { cookies } from 'next/headers'

async function delete(data) {
  const oneDay = 24 * 60 * 60 * 1000
  cookies().set('name', 'value', { expires: Date.now() - oneDay })
}

Важно знать: Можно удалять только куки, принадлежащие тому же домену, из которого вызывается .set(). Кроме того, код должен выполняться по тому же протоколу (HTTP или HTTPS), что и удаляемый куки.

История версий

ВерсияИзменения
v13.0.0Добавлена функция cookies.