我正在使用Node / Express / Mongo实现会话存储。我的问题是我无法从sessions
集合中检索任何会话,因此我无法确定用户是否已登录。
我正在使用MongoSkin,MongoStore和mongo-connect,虽然我不介意使用Mongoose和其他工具。
这是我的调试输出:
// Check whether the current user has a session.
// If so, adds "currentUser" to the request.
// Else, redirect to the login page.
function loadUser(req, res, next) {
console.log("loadUser: checking loadUser...");
var db = req.db;
console.log("current req.session.token:");
console.log(req.session.token);
console.log("current req.session:");
console.log(req.session);
if (req.session.token) {
// Look up the session id in the database 'sessions' collection.
db.collection('sessions').findOne({token : req.session.token}, function(err, user) {
console.log("found user by looking up token:");
console.log(user);
if (user) {
req.currentUser = user;
next();
} else {
console.log("token not in 'sessions', redirecting...");
res.redirect('/login/webapp_login.html');
}
});
} else {
console.log("no token, redirecting...");
res.redirect('/login/webapp_login.html');
}
}
这是控制台输出:
loadUser: checking loadUser...
current req.session._id:
53acb8e1b7b297dc29681def
current req.session:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
isLogged: 21,
username: 'sessiontest1',
token: '57a6dfe0bea9150bd4e2d1f76974e88b',
}
found user by looking up token:
null
token not in 'sessions', redirecting...
同时:
db.collection('sessions').find(req.session._id, function(user) {
我也尝试过:
db.collection('sessions').findOne({session:{token:req.session.token}}, function(err, user) {
但我仍然得到null
并且该功能重定向。我错过了什么吗?任何的意见都将会有帮助。我使用的是MongoSkin,虽然我也对Mongoose的解决方案持开放态度。
此外,我知道我的数据库配置正确,因为我检查了命令行:
> db.sessions.find().pretty()
{
"_id" : "vnftBGNFVQ3S4lHiIB_omOxWDu01kFuH",
"session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":t
rue,\"path\":\"/\"},\"isLogged\":6}",
"expires" : ISODate("2014-07-09T03:44:54.863Z")
}
{
"_id" : "-AMKc_kIzOOAn_eQJ6RJpvTgWoargLaJ",
"session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":t
rue,\"path\":\"/\"},\"isLogged\":20,\"username\":\"sessiontest1\",\"token\":\"57a6dfe0bea
9150bd4e2d1f76974e88b\"}",
"expires" : ISODate("2014-07-11T06:35:14.835Z")
}
出了什么问题,为什么我无法从我的sessions
集合中检索会话?
更新 正在运行
db.collection('sessions')。find({“session”:/。/},function(err,user){
给了我一个输出,所以我认为问题是将记录与会话字段的字符串中的字段匹配。上面的数据库输出中显示的session
字段是有问题的,因为它是一个长字符串而不是嵌套的JSON。
此外,我将sessions
记录添加到我的app.js
后会自动插入:
app.use(expressSession({
secret: 's3cretc0de',
store: new MongoStore({
url: mongoUrl
}, function () {
console.log("db session connection open");
})
}));
我在路由器中添加了token
和username
字段,如下所示:
router.get('/verify', function(req, res) {
req.session.username = username;
req.session.token = req.query.token;
}
我错过了什么吗?任何帮助将不胜感激。
答案 0 :(得分:4)
当您使用MongoStore存储会话数据时,您不需要直接查询MongoDB。该模块为您做了一切。
您只需使用req.session
即可获取会话数据。
因此,在您的路线中,您可以执行以下操作:
app.get('/', function(req, res){
// check if the username is set in the session
if (!req.session.username) {
// redirect it to login page
res.redirect('/login');
} else {
// do something
}
});
app.post('/login', function(req, res) {
// you would check check the username & password here
// if (username == '...' /&& password ...)
// set the username in the session session
req.session.username = username;
});