在快速js中获取中间件函数中的会话变量

时间:2015-08-03 14:21:02

标签: javascript node.js mongodb session express

我正在express.jsmongodb的帮助下开设网站。

要持续使用本网站,我使用快递会话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});
        }
    });
});

但它无法正常工作。

2 个答案:

答案 0 :(得分:0)

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

首先确保您已在异步回调中正确分配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-session自动使用。

答案 1 :(得分:0)

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

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

这也可以表明问题所在的更多内容。

也。尝试将该功能放在控制器中,看看它是否仍然不适合你。 (而不是在路线中传递)

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

确保您的中间件设置正确

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

如果您检查了上述所有内容,请查看服务器的控制台。它会输出有关会话变量或变量的任何错误吗?如果是这样,请发布

希望以某种方式指导你。欢呼声