【问题标题】:Get Session Variable in middleware function in express js在express js的中间件函数中获取会话变量
【发布时间】:2015-10-25 16:56:03
【问题描述】:

我在express.jsmongodb 的帮助下开发一个网站。

为了持续使用这个网站,我使用的是 express-session v1.11.3。而且,为了检查用户是否登录,我创建了一个中间件功能。在这个函数中,我试图获得一个会话,但它总是返回Undefined

登录到路由器时,我有一个带有用户 obj 的初始化会话变量。如下:

//users router
router.all('/login', function(req, res) {
    var db = req.db;
    .....
    ........
     //on successfully login
     req.session.user = user;
     res.redirect('/dashboard');
});

我在users.js路由器文件中创建了这个中间件函数来进行身份验证。下面是这个函数的代码:

function requiredAuthentication(req, res, next) {
    if (req.session.user) {
        next();
    } else {
        res.redirect("/users/login");
    }
}

现在,我正在尝试获取用户列表,只有经过身份验证的用户才能获得:

router.get('/index',requiredAuthentication, function(req, res, next) {
    var db = req.db;
    db.collection('users').find().toArray(function(err, users) {
        if (err) {
            res.render('error', {error: err});
        }else {
            res.render('users/index', {users: users});
        }
    });
});

但它不能正常工作。

【问题讨论】:

  • 您所说的“无法正常工作”是什么意思?你能描述一下由此产生的行为吗?最简单的调试方法是使用console.log() ;)
  • 中间件函数 requiredAuthentication , req.session.user 值未定义请立即建议
  • 您确定您已正确包含express-session 中间件吗?
  • 是的,我已经包含在 app.js 中,例如 var session = require('express-session'); app.use(session({secret: 'keyboard cat'})) 请立即提出建议

标签: javascript node.js mongodb session express


【解决方案1】:

一个好的做法是在检查用户是否添加到会话变量之前也检查会话是否存在。

if (req.session && req.session.user) {
   //do something
} 

这也可以进一步说明问题所在。

还有。尝试将该功能放入控制器中,看看它是否仍然不适合您。 (而不是在路由中传递)

检查您是否正确应用了所有需要的模块(快速会话 - 并且是最新的并且没有损坏。(如果没有,请更新到最新版本)

确保您的中间件设置正确

app.use(session({
  secret: '',
  saveUninitialized: true/false,
  resave: true/false 
}));

如果您确实检查了以上所有内容,请查看您服务器的控制台。它是否输出有关会话 var 或 decleration 的任何错误。?如果有请发帖

希望这篇文章能以某种方式指导您。干杯

【讨论】:

    【解决方案2】:

    您发布的代码部分似乎没问题,问题可能出在此处不可见的其他代码中。

    首先确保您在从数据库中获取用户的异步回调中正确分配了req.session.user

    还要检查express-session中间件是否正确包含,不要忘记use(session)中间件,比如:

    var express = require('express');
    var session = require('express-session');
    
    var app = express();
    
    app.use(session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: true
    }));
    

    另外,尝试包含和use(express-cookies)中间件,这在以前的express版本中是一个问题,但现在它被express-session自动使用了。

    【讨论】:

    • 谢谢,我刚刚更改了您提供的代码,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2011-12-09
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多