无法使用 NextJS 9 的 API 路由设置 cookie

Dan*_*ein 15 javascript node.js next.js

通常,在使用 Express 时,“res”对象中似乎有“cookie”,因此您可以执行以下操作:

res.cookie('session', sessionCookie, options);
Run Code Online (Sandbox Code Playgroud)

NextJS 在 Next 9 提供的 API 路由中,查看 res 的时候,是不存在的。有没有办法在 Next API Route 函数中为响应对象设置 cookie?

Kev*_*Law 27

改编自官方 repo 中间件示例,您可以Set-Cookie通过res如下方式设置标头:

import { serialize } from 'cookie';

function (req, res) {
   // ...
   // setHeader(headerName: string, cookies: string | string[])
   // can use array for multiple cookies
   res.setHeader('Set-Cookie', serialize('token', 'token_cookie_value', { path: '/' }));
}
Run Code Online (Sandbox Code Playgroud)

  • _提示_,如果您使用打字稿,您应该安装类型定义作为开发依赖项:`npm i -D @types/cookie` (6认同)
  • @Afsanefda,您可以在第二个参数中使用数组,如下所示: `res.setHeader('Set-Cookie', [ serialize('foo', 'bar', { path: '/' }), serialize('hello', '世界', { 路径: '/' }) ]);` (4认同)
  • 您还可以使用serialize('token', token, { httpOnly: true }) 设置HttpOnly cookie https://github.com/jshttp/cookie/blob/master/index.js#L91 (3认同)
  • @Chukwu3meka它是可选的只是一个实用函数。只需将您的 cookie 写为字符串即可。请参阅:https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies (2认同)

Mad*_*eka 7

我刚刚在 Next.js 中找到了一种更简单的方法来做到这一点,尽管使用了一个库——cookie -next

跑步 npm install --save cookies-next

如果您使用的 next.js 版本高于 12.2.0,则需要使用 cookies-next 2.1.0 或更高版本

客户端示例

import { getCookies, setCookie, deleteCookie } from 'cookies-next';

// we can use it anywhere

getCookies();
getCookie('key');
setCookie('key', 'value');
deleteCookie('key');
Run Code Online (Sandbox Code Playgroud)

服务器示例

getServerSidePropspages/api

import { getCookies, getCookie, setCookie, deleteCookie } from 'cookies-next';

export default async function handler(req, res) {
  setCookie('server-key', 'value', { req, res, maxAge: 60 * 60 * 24 });
  getCookie('key', { req, res });
  getCookies({ req, res });
  deleteCookie('key', { req, res });
Run Code Online (Sandbox Code Playgroud)

注意客户端和服务器的区别。对于服务器端,您必须将 { req, res } 传递给 next-cookie,否则它将不起作用