【问题标题】:Reading Cookies from Express Middleware从 Express 中间件读取 Cookie
【发布时间】:2020-02-25 15:51:16
【问题描述】:

我正在使用 Express 和 Unblocker 模块以及用于读取 cookie 的 CookieParser 制作应用程序。我有一个简单的系统,其中 if 语句读取 req.cookies.visits 并查看它是 0 还是未定义,然后重定向到密码屏幕。但是,当考虑到 Unblocker 模块时,就会出现问题。在做

app.get('/proxy', function(req, res){
    if(req.cookies.visits==0||req.cookies.visits==undefined){
        res.redirect("/password");
    } else {
        res.sendFile(__dirname + '/public/index.html');
    }
});

在发出请求时不读取 cookie(因为路由是 /proxy/http 地址)。我尝试过使用 express 中间件,但执行 req.cookie.visits 会导致未定义的错误。 Unblocker 也有一个内置的中间件功能,但是 npm 上的页面只显示了如何做一个响应而不是一个请求。

基本上,我怎样才能读取每个请求的 cookie 并与此模块兼容?

【问题讨论】:

    标签: node.js express cookies


    【解决方案1】:

    查看带有中间件的完整示例:

    const express = require('express')
    const app = express();
    const port = 3000;
    var Unblocker = require('unblocker');
    const cookieParser = require("cookie-parser");
    app.use(cookieParser());
    
    app.use(new Unblocker({prefix: '/proxy/'}));
    
    function checkVisits(req,res,next){
        let visits;
        try {
            visits = req.cookies.visits;
            if(isNaN(visits)){
                visits = 0;
            }
            console.log("visits:" + visits);
        } catch {
            console.log("no visits");
            visits = 0;
        }finally{
            if(visits === 0){
                res.redirect("/password");
                return;
            }
            res.visits = parseInt(visits)+1;
            res.cookie('visits',res.visits, { maxAge: 900000, httpOnly: true });
            return next();
        }
    }
    
    //add checkVisits(req,res,next) as a middleware
    app.get('/index',checkVisits, function (req, res) {
        res.send('index visits:'+res.visits);
      })
    //add checkVisits(req,res,next) as a middleware
    app.get('/home',checkVisits, function (req, res) {
        res.send('home visits:'+res.visits);
    })
    
    app.get('/password', function (req, res) {
        res.send('password page');
    })
    
    app.listen(port, () => console.log("App listening on port %s!", port))
    

    checkVisits(req,res,next) 中间件将检查访问 cookie。如果访问 cookie 为 0,用户将被重定向到路由 /password 。

    【讨论】:

    • 这会覆盖所有子路由(如 /proxy/example.com)吗?
    • 我用中间件更新了我的答案,以覆盖 /proxy/* 之后的所有路由
    • 这行得通,但是我不得不删除 app.use 并只在该特定路由上使用解锁器中间件,因为它干扰了 cookie 中间件。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2015-07-13
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多