【发布时间】:2016-08-17 20:55:48
【问题描述】:
我在通过 express 设置 cookie 时遇到问题。我正在使用Este.js dev stack 并尝试在API auth /login 路由中设置一个cookie。这是我在/api/v1/auth/login route 中使用的代码
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 选项卡也为空):(
编辑:
我发现当我在/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 frontend rendering part。
当我使用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 发送数据,我该如何处理呢?
【问题讨论】:
-
你知道是
document.cookie,而不是document.cookies吗?而且,当您查找 cookie 时,您是否在与/api/v1/auth/login发送到的域完全相同的页面中? -
抱歉输入错误,确保
document.cookie为空(已编辑)。是的,它是同一个域,一切都在http://localhost:8000/ -
@Mira cookie 在以后的请求中是否在服务器端可用 -
req.cookies.token?Set-Cookie标头中的值后面还有哪些其他选项? -
@JonathanLonowski 正如我所说,所有请求都来自同一个域。我之前也尝试在
res.cookies选项中更改httpOnly: false但没有任何效果:( -
主要问题是cookie根本没有保存在浏览器中。