在Express中设置客户端可访问Cookie

dsh*_*per 32 cookies node.js express socket.io

我正在使用Express和SocketIO的Node应用程序.我想在我的Express控制器中设置一个cookie,然后可以从我的客户端Javascript代码访问它.我尝试的一切似乎都不起作用:

res.setHeader('Set-Cookie','test=value');
res.cookie('rememberme', 'yes', { maxAge: 900000 });
Run Code Online (Sandbox Code Playgroud)

这里有什么我想念的吗?提前致谢!

dsh*_*per 53

弄清楚了!默认情况下,Express将选项httpOnly设置为true.这意味着客户端Javascript无法访问您的cookie.为了正确设置客户端上可访问的cookie,只需使用以下代码段:

res.cookie('rememberme', 'yes', { maxAge: 900000, httpOnly: false});
Run Code Online (Sandbox Code Playgroud)

我还注意到,如果你调用这个命令然后调用res.redirect,cookie就不会被设置.此命令需要在某个时刻由res.render执行,以使其工作.不知道为什么会这样.

  • @ user644745你可以通过查看`res.cookies`对象来读取Express中的cookie.例如,名为`session_id`的cookie将存在于`res.cookies.session_id`中.http://expressjs.com/api.html#req.cookies (6认同)
  • @frontendbeauty当然你的意思是`req.cookies`而不是`res.cookies`. (3认同)
  • 需要调用res.render或res.send的原因是因为设置cookie不会启动响应。发送和渲染。此cookie方法只是将cookie添加到响应对象。 (2认同)

小智 5

事实上,我在几个小时内经历了同样的问题。

这是我的代码:

res.cookie("mycookie", "1234567890", { secure:true, maxAge:120000, httpOnly: true });
Run Code Online (Sandbox Code Playgroud)

我可以在响应头中看到 Set-Cookie 指令,但在 Chrome 中我找不到 cookie,也无法通过 req.cookies['mycookie'] 找到 cookie。

这个问题的根本原因是我没有使用HTTPS连接。(带有 cookie 解析器中间件的 Express 4.x)

根据此文档:保护 Express Node 应用程序安全的简单步骤

如果我设置选项 secure=true,那么浏览器将不会在任何 HTTP 请求中发送我的 cookie,而是在 HTTPS 安全连接中发送。然后在我删除 secure:true 选项后,我得到了 cookie 的工作。