cookies
cookies
是一个异步函数,允许您在伺服器组件 (Server Components) 中读取 HTTP 传入请求的 cookies,并在伺服器动作 (Server Actions) 或路由处理器 (Route Handlers) 中读取/写入传出请求的 cookies。
参考
方法
以下方法可用:
方法 | 返回类型 | 描述 |
---|---|---|
get('name') | 物件 | 接受 cookie 名称并返回包含名称和值的物件。 |
getAll() | 物件数组 | 返回所有匹配名称的 cookies 列表。 |
has('name') | 布尔值 | 接受 cookie 名称并返回该 cookie 是否存在的布尔值。 |
set(name, value, options) | - | 接受 cookie 名称、值和选项,并设置传出请求的 cookie。 |
delete(name) | - | 接受 cookie 名称并删除该 cookie。 |
clear() | - | 删除所有 cookies。 |
toString() | 字符串 | 返回 cookies 的字符串表示形式。 |
选项
设置 cookie 时,options
物件支持以下属性:
选项 | 类型 | 描述 |
---|---|---|
name | 字符串 | 指定 cookie 的名称。 |
value | 字符串 | 指定要存储在 cookie 中的值。 |
expires | 日期 | 定义 cookie 的确切过期日期。 |
maxAge | 数字 | 设置 cookie 的生命周期(以秒为单位)。 |
domain | 字符串 | 指定 cookie 可用的域名。 |
path | 字符串,默认: '/' | 将 cookie 的范围限制在域名的特定路径下。 |
secure | 布尔值 | 确保 cookie 仅通过 HTTPS 连接发送以增加安全性。 |
httpOnly | 布尔值 | 限制 cookie 仅用于 HTTP 请求,防止客户端访问。 |
sameSite | 布尔值, 'lax' , 'strict' , 'none' | 控制 cookie 的跨站请求行为。 |
priority | 字符串 ("low" , "medium" , "high" ) | 指定 cookie 的优先级。 |
encode('value') | 函数 | 指定用于编码 cookie 值的函数。 |
partitioned | 布尔值 | 指示 cookie 是否为分区 cookie (partitioned)。 |
唯一具有默认值的选项是 path
。
要了解更多关于这些选项的信息,请参阅 MDN 文档。
须知
cookies
是一个异步函数,返回一个 Promise。您必须使用async/await
或 React 的use
函数来访问 cookies。- 在版本 14 及更早版本中,
cookies
是一个同步函数。为了向后兼容,您仍然可以在 Next.js 15 中同步访问它,但此行为将在未来被弃用。
- 在版本 14 及更早版本中,
cookies
是一个动态 API (Dynamic API),其返回值无法提前预知。在布局或页面中使用它将使路由选择动态渲染 (dynamic rendering)。.delete
方法只能在以下情况下调用:- 在伺服器动作 (Server Action) 或路由处理器 (Route Handler) 中。
- 如果它属于与
.set
调用相同的域名。对于通配符域名,特定子域名必须完全匹配。此外,代码必须在与要删除的 cookie 相同的协议(HTTP 或 HTTPS)上执行。
- HTTP 不允许在流式传输开始后设置 cookies,因此您必须在伺服器动作 (Server Action) 或路由处理器 (Route Handler) 中使用
.set
。
理解伺服器组件中的 Cookie 行为
在伺服器组件中使用 cookies 时,重要的是要理解 cookies 本质上是客户端存储机制:
- 读取 cookies 在伺服器组件中有效,因为您访问的是客户端浏览器在 HTTP 请求标头中发送到伺服器的 cookie 数据。
- 设置 cookies 不能直接在伺服器组件中完成,即使使用路由处理器或伺服器动作也是如此。这是因为 cookies 实际上是由浏览器存储的,而不是伺服器。
伺服器只能发送指令(通过 Set-Cookie
标头)告诉浏览器存储 cookies - 实际的存储发生在客户端。这就是为什么修改状态的操作(.set
、.delete
、.clear
)必须在可以正确设置响应标头的路由处理器或伺服器动作中执行。
示例
获取单个 cookie
您可以使用 (await cookies()).get('name')
方法获取单个 cookie:
获取所有 cookies
您可以使用 (await cookies()).getAll()
方法获取所有匹配名称的 cookies。如果未指定 name
,则返回所有可用的 cookies。
设置 cookie
您可以在伺服器动作 (Server Action) 或路由处理器 (Route Handler) 中使用 (await cookies()).set(name, value, options)
方法设置 cookie。options
物件 是可选的。
检查 cookie 是否存在
您可以使用 (await cookies()).has(name)
方法检查 cookie 是否存在:
删除 cookies
有三种方法可以删除 cookie。
使用 delete()
方法:
设置一个具有相同名称和空值的新 cookie:
将 maxAge
设置为 0 将立即使 cookie 过期。maxAge
接受以秒为单位的值。
版本历史
版本 | 变更 |
---|---|
v15.0.0-RC | cookies 现在是一个异步函数。提供了代码修改工具 (codemod)。 |
v13.0.0 | 引入 cookies 。 |