【问题标题】:How to get cookie value in expressjs如何在expressjs中获取cookie值
【发布时间】: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 有关的问题。

标签: node.js express cookies


【解决方案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 };
    猜你喜欢
    • 2013-11-04
    • 2015-08-14
    • 2015-02-23
    • 2019-01-06
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2012-01-19
    相关资源
    最近更新 更多