我正在使用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; }
我错过了什么吗?任何帮助将不胜感激.