如何在expressjs中获取cookie值

Posted

技术标签:

【中文标题】如何在expressjs中获取cookie值【英文标题】:How to get cookie value in expressjs 【发布时间】:2017-12-02 15:30:55 【问题描述】:

我正在使用cookie-parser,所有教程都在讨论如何设置cookie以及它的到期时间,但没有教我们如何获取这些cookie的值

【问题讨论】:

你试过req.cookiesreq.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());

然后您可以从

访问 cookie
req.cookies

希望有所帮助。

【讨论】:

【参考方案2】:

首先请注意,Cookie 是通过服务器请求发送到客户端并存储在客户端。每次用户重新加载网站时,此 cookie 都会随请求一起发送。

因此您可以使用

在客户端(例如,在您的客户端 Java 脚本中)访问 cookie
document.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值的主要内容,如果未能解决你的问题,请参考以下文章

如何避免从 ExpressJS 抛出 400 错误

js写cookie,如何完成其保存功能

什么是 connect/expressjs 中的“签名”cookie?

设置获取cookie,setCookie,getCookie

如何在模板中获取 cookie 值?

js设置cookie过期时间