【问题标题】:Nextjs- api routes , How to remove a cookie from header?Nextjs- api 路由,如何从标头中删除 cookie?
【发布时间】:2020-09-17 23:01:35
【问题描述】:

我有两个 API 路由,我想在 /api/login.js 中设置两个 cookie 并在 /api/logout.js 中删除它们。

这是我的登录 API:

import { serialize } from 'cookie';

export default async (req, res) => {
  res.setHeader('Set-Cookie', [
    serialize('mytoken1', 'mytoken1Value', {
      path: '/',
    }),
    serialize('mytoken2', 'mytoken2Value', {
      path: '/',
    }),
  ]);

  res.writeHead(302, { Location: '/' });
  res.end();
}

这是我的注销 API:

export default async (req, res) => {
  res.removeHeader('Set-Cookie')

  res.writeHead(302, { Location: '/api/login' });
  res.end();
}

但注销不会删除 cookie,所以当我重新加载页面时,我仍然可以在 _app.js ---console.log(req.headers.cookie)--- 中看到它们.你知道在这种情况下如何删除 cookie 吗?

【问题讨论】:

  • 要清除一个cookie,你可以用过去的日期再次设置它,而不是简单地删除标题
  • 这能回答你的问题吗? Destroy cookie NodeJs
  • @LawrenceCherone 我试过了,不幸的是它不起作用
  • 您发送的第二个链接无效。它一直说:TypeError:cookie__WEBPACK_IMPORTED_MODULE_3___default.a.set 不是函数

标签: node.js express cookies next.js


【解决方案1】:

你可以这样做:

res.setHeader('Set-Cookie', 'mytoken1=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT');
res.setHeader('Set-Cookie', 'mytoken2=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT');

Source

更新

src/pages/api/auth/signout.ts

import { NextApiHandler } from 'next';
import { NotFoundError } from 'errors/not-found-error';
import { errorHandler } from 'middlewares/error-handler';

const routeHandler: NextApiHandler = (req, res) => {
  if (req.method === 'POST') {
    res.setHeader('Set-Cookie', 'jwt=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT');
    res.send({});
  } else {
    throw new NotFoundError();
  }
};

export default errorHandler(routeHandler);

【讨论】:

  • 这样不行!它说 res.setHeader 没有定义
  • 这是我的代码,它可以工作:file:src/pages/api/auth/signout.tsimport { NextApiRequest, NextApiResponse, NextApiHandler } from 'next'; import { NotFoundError } from 'errors/not-found-error'; const routeHandler: NextApiHandler = (req: NextApiRequest, res: NextApiResponse) => { if (req.method === 'POST') { res.setHeader('Set-Cookie', 'jwt=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT'); res.send({}); } else { throw new NotFoundError(); } }; export default routeHandler;
  • 您能否编辑您的答案并将此代码添加到其中以使其更具可读性?谢谢
  • 我将此 sn-p 添加到我的答案中
【解决方案2】:

因此,在对每个解决方案都进行了太多挑战之后,我最终得到了这个并且效果很好:

(我有多个 cookie,我不得不使用 nodejs 方法,因为我在没有任何中间件的情况下使用 nextjs API 路由进行编码)

export default async (req, res) => {
  /* remove cookies from request header */
  res.setHeader('Set-Cookie', [
    serialize('mytoken1', '', {
      maxAge: -1,
      path: '/',
    }),
    serialize('mytoken2', '', {
      maxAge: -1,
      path: '/',
    }),
  ]);

  res.writeHead(302, { Location: '/api/login' });
  res.end();
}

关键是 maxAge 应该是 -1 以使其过期。我用 Date.now() 试过了。当您有多个 cookie 时,您必须在操作完两个 cookie 后结束响应。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 2016-12-28
    • 2022-10-06
    • 2022-10-24
    • 1970-01-01
    • 2019-12-24
    • 2022-12-05
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多