如何在expressjs中获取cookie值
Posted
技术标签:
【中文标题】如何在expressjs中获取cookie值【英文标题】:How to get cookie value in expressjs 【发布时间】:2017-12-02 15:30:55 【问题描述】:我正在使用cookie-parser,所有教程都在讨论如何设置cookie以及它的到期时间,但没有教我们如何获取这些cookie的值
【问题讨论】:
你试过req.cookies
或req.signedCookies
吗?
@MariaInesParnisari 我试过了,但它没有按我的预期工作例如:我设置: res.cookie('user', username, maxAge: 10800);那么如何获取“用户”cookie 的值呢?我按照你说的尝试过,但它返回
如果您使用旧的 google chrome,您将看不到 cookie。尝试更新浏览器。其中存在与显示 cookie 有关的问题。
【参考方案1】:
对于偶然发现这个问题的人,我是这样做的:
您需要安装 express cookie-parser 中间件,因为它不再与 express 打包。
npm install --save cookie-parser
然后这样设置:
const cookieParser = require("cookie-parser");
const app = express();
app.use(cookieParser());
然后您可以从
访问 cookiereq.cookies
希望有所帮助。
【讨论】:
【参考方案2】:首先请注意,Cookie 是通过服务器请求发送到客户端并存储在客户端。每次用户重新加载网站时,此 cookie 都会随请求一起发送。
因此您可以使用
在客户端(例如,在您的客户端 Java 脚本中)访问 cookiedocument.cookie
您可以通过打开浏览器的控制台 (F12) 并键入在客户端进行测试
console.log(document.cookie);
您可以使用从服务器(在您的情况下为 expressjs)端访问 cookie
req.cookies
最佳做法是在客户端检查它是否存储正确。请记住,并非所有浏览器都允许在未经用户许可的情况下存储 cookie。
根据您的评论,您的代码应该类似于
var express = require('express');
var app = express();
var username ='username';
app.get('/', function(req, res)
res.cookie('user', username, maxAge: 10800).send('cookie set');
);
app.listen(3000);
【讨论】:
是否可以获取cookie的maxAge,还是每次都要重新设置? 有时服务器端在等待前端之前很重要【参考方案3】:希望对你有帮助
const app = require('express')();
app.use('/', (req, res) =>
var cookie = getcookie(req);
console.log(cookie);
);
function getcookie(req)
var cookie = req.headers.cookie;
// user=someone; session=QyhYzXhkTZawIb5qSl3KKyPVN (this is my cookie i get)
return cookie.split('; ');
输出
['user=someone', 'session=QyhYzXhkTZawIb5qSl3KKyPVN']
【讨论】:
nice.. 推出自己的解决方案,而不是安装包! 我可以建议对 getcookie 进行一些改进吗?函数 getcookie(req) const headers: cookie = req; return cookie.split(';').reduce((res,item) => const data = item.trim().split('='); return ...res, [data[0]] :数据[1] ; , ); 这个版本返回一个对象。 @repeatdomiau 您的函数将删除所有等于“=”(如果它是 base64 字符串)。【参考方案4】:只是想补充一点,我们不应该使用模块来做琐碎的事情。模块是非常方便和快速的开发,但通过创建基础代码使我们无法学习。
我是教授而不是老板,所以我更看重程序员的知识/技能开发,而不是在更短的时间内编写代码而不学习任何东西......
回到正题...
除非您需要签名 cookie 或更复杂的东西,否则完全可以编写自己的中间件来解析 cookie 并将值添加到管道的其余部分,就像模块一样。
app.use((req, res, next) =>
const headers: cookie = req;
if (cookie)
const values = cookie.split(';').reduce((res, item) =>
const data = item.trim().split('=');
return ...res, [data[0]]: data[1] ;
, );
res.locals.cookie = values;
else res.locals.cookie = ;
next();
);
任何您需要读取 cookie 的地方都可以通过 res.locals.cookie
获得,方便地格式化为对象。
您甚至可以在此处添加自定义加密策略,以确保没有人在读取您的 cookie。
记住中间件是有序的,因此必须在使用 cookie 的任何其他中间件或路由之前添加这个。
【讨论】:
非常好!我还建议使用更多解构使其更具可读性: const [name, value] = item.trim().split('='); return ...res, [name]: value ;以上是关于如何在expressjs中获取cookie值的主要内容,如果未能解决你的问题,请参考以下文章
什么是 connect/expressjs 中的“签名”cookie?