Menu

cookies

cookies 函数允许你在 服务器组件 中读取 HTTP 传入请求的 cookie,或在 服务器操作路由处理程序 中写入传出请求的 cookie。

值得注意的是cookies() 是一个 动态函数,其返回值无法提前知晓。在布局或页面中使用它将使路由在请求时进入 动态渲染

cookies().get(name)

这是一个方法,接受一个 cookie 名称并返回一个包含 name 和 value 的对象。如果没有找到名为 name 的 cookie,它将返回 undefined。如果有多个匹配的 cookie,它只会返回第一个匹配项。

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 的 cookie 列表。如果未指定 name,它将返回所有可用的 cookie。

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)

这个方法接受一个 cookie 名称,并根据该 cookie 是否存在返回一个布尔值 (存在则为 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)

这个方法接受一个 cookie 名称、值和选项,并设置传出请求的 cookie。

值得注意的是:HTTP 不允许在流式传输开始后设置 cookie,所以你必须在 服务器操作路由处理程序 中使用 .set()

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: "/",
  });
}

值得注意的是:你只能在 服务器操作路由处理程序 中删除 cookie。

删除 cookie 有几种选择:

cookies().delete(name)

你可以显式删除具有给定名称的 cookie。

app/actions.js
'use server'
 
import { cookies } from 'next/headers'
 
async function delete(data) {
  cookies().delete('name')
}

cookies().set(name, '')

另外,你可以设置一个具有相同名称但值为空的新 cookie。

app/actions.js
'use server'
 
import { cookies } from 'next/headers'
 
async function delete(data) {
  cookies().set('name', '')
}

值得注意的是.set() 只在 服务器操作路由处理程序 中可用。

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

maxAge 设置为 0 将立即使 cookie 过期。maxAge 接受以秒为单位的值。

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 设置为过去的任何值将立即使 cookie 过期。

app/actions.js
'use server'
 
import { cookies } from 'next/headers'
 
async function delete(data) {
  const oneDay = 24 * 60 * 60
  cookies().set('name', 'value', { expires: Date.now() - oneDay })
}

值得注意的是:你只能删除属于调用 .set() 的同一域的 cookie。此外,代码必须在与你想要删除的 cookie 相同的协议 (HTTP 或 HTTPS) 上执行。

版本历史

版本变更
v13.0.0引入 cookies 函数。

下一步

关于接下来要做什么,我们推荐以下章节