我在通过 express 设置 cookie 时遇到问题。我正在使用 Este.js dev stack
我尝试在 API auth /login
路由中设置一个 cookie。这是我在 /api/v1/auth/login
路由中使用的代码
res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999)});
res.status(200).send({user, token: jwt.token});
在 src/server/main.js
我已经注册 cookie-parser
作为第一个中间件
app.use(cookieParser());
/api/v1/auth/login
路由的响应头包含
Set-Cookie:token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ..
但 cookie 未保存在浏览器中( document.cookie
为空,也 Resources - Cookies
develepoers 工具中的选项卡为空):(
编辑: 我发现当我在 /api/v1/auth/login
中调用它时(没有调用 res.send
或 res.json
)
res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false});
next();
然后设置 cookie 并且 响应标头已设置 X-Powered-By:Este.js
…这将设置 esteMiddleware
在 expres 前端渲染部分。
当我使用 res.send
res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false}).send({user, token: jwt.token});`
next();
然后我得到错误 Can't set headers after they are sent.
因为 send
方法被使用,所以前端渲染抛出这个错误。
但是我必须从 API 发送数据,那么我该如何处理呢?
原文由 Mira 发布,翻译遵循 CC BY-SA 4.0 许可协议
我遇到过同样的问题。服务器响应带有 cookie 集:
但是 cookie 没有被浏览器保存。
我就是这样解决的。
我在客户端代码中使用
fetch
。如果您没有在 --- 选项中指定credentials: 'include'
fetch
选项,cookie 既不会发送到服务器也不会被浏览器保存,尽管服务器响应设置了 cookie。例子: