我正在express.js
和mongodb
的帮助下开设网站。
要持续使用本网站,我使用快递会话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});
}
});
});
但它无法正常工作。
答案 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
}));
如果您检查了上述所有内容,请查看服务器的控制台。它会输出有关会话变量或变量的任何错误吗?如果是这样,请发布
希望以某种方式指导你。欢呼声