cookies
cookies
是一个异步函数,允许你在 服务端组件 中读取 HTTP 传入请求的 cookies,并在 服务器操作 或 路由处理器 中读取/写入传出请求的 cookies。
- TypeScript
- JavaScript
app/page.tsx
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
app/page.js
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
参考
方法
以下方法可用:
方法 | 返回类型 | 描述 |
---|---|---|
get('name') | Object | 接受 cookie 名称并返回包含名称和值的对象。 |
getAll() | Array of objects | 返回具有匹配名称的所有 cookies 的列表。 |
has('name') | Boolean | 接受 cookie 名称并根据 cookie 是否存在返回布尔值。 |
set(name, value, options) | - | 接受 cookie 名称、值和选项,并设置传出请求的 cookie。 |
delete(name) | - | 接受 cookie 名称并删除 cookie。 |
clear() | - | 删除所有 cookies。 |
toString() | String | 返回 cookies 的字符串表示。 |
选项
设置 cookie 时,支持 options
对象的以下属性:
选项 | 类型 | 描述 |
---|---|---|
name | String | 指定 cookie 的名称。 |
value | String | 指定要存储在 cookie 中的值。 |
expires | Date | 定义 cookie 将过期的确切日期。 |
maxAge | Number | 以秒为单位设置 cookie 的生命周期。 |
domain | String | 指定 cookie 可用的域。 |
path | String, default: '/' | 将 cookie 的范围限制在域内的特定路径。 |
secure | Boolean | 确保 cookie 仅通过 HTTPS 连接发送以提高安全性。 |
httpOnly | Boolean | 将 cookie 限制为 HTTP 请求,防止客户端访问。 |
sameSite | Boolean, 'lax' , 'strict' , 'none' | 控制 cookie 的跨站请求行为。 |
priority | String ("low" , "medium" , "high" ) | 指定 cookie 的优先级 |
encode('value') | Function | 指定用于编码 cookie 值的函数。 |
partitioned | Boolean | 指示 cookie 是否被 分区。 |
唯一具有默认值的选项是 path
。
要了解有关这些选项的更多信息,请参阅 MDN 文档。
提示
cookies
是一个异步函数,返回一个 Promise。你必须使用async/await
或 React 的use
函数来访问 cookies。- 在版本 14 及更早版本中,
cookies
是一个同步函数。为了帮助向后兼容,你仍然可以在 Next.js 15 中同步访问它,但此行为将在未来被弃用。
- 在版本 14 及更早版本中,
cookies
是一个 动态 API,其返回值无法提前知道。在布局或页面中使用它会使路由选择 动态渲染。.delete
方法只能在以下情况下调用:- HTTP 不允许在流式传输开始后设置 cookies,因此你必须在 服务器操作 或 路由处理器 中使用
.set
。
理解服务端组件中的 Cookie 行为
在服务端组件中使用 cookies 时,重要的是要理解 cookies 本质上是客户端存储机制:
- 读取 cookies 在服务端组件中有效,因为你正在访问客户端浏览器在 HTTP 请求头中发送到服务器的 cookie 数据。
- 设置 cookies 不能直接在服务端组件中完成,即使使用路由处理器或服务器操作也是如此。这是因为 cookies 实际上是由浏览器存储的,而不是服务器。
服务器只能发送指令(通过 Set-Cookie
头)告诉浏览器存储 cookies - 实际存储发生在客户端。这就是为什么修改状态(.set
、.delete