如何使用Express和MongoStore从MongoDB集合中find一个会话

我正在使用Node / Express / Mongo实现会话存储。 我的问题是,我无法检索我的sessions收集任何会议,所以我无法确定用户是否已经login。

我正在使用MongoSkin,MongoStore和mongo-connect,但我不介意使用Mongoose和其他工具。

这是我的debugging输出:

 // 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 ,functionredirect。 我错过了什么吗? 任何的意见都将会有帮助。 我正在使用MongoSkin,虽然我也对Mongoose的解决scheme开放。

另外,我知道我的数据库configuration正确,因为我检查了命令行:

 > 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集合中检索sessions

更新运行

db.collection('sessions')。find({“session”:/./},function(err,user){

给我一个输出,所以我相信问题是匹配一个logging与会话字段的string内的字段。 上面的数据库输出中显示的session字段有问题,因为它是一个长string,而不是嵌套的JSON。

此外,我的sessionslogging被添加到我的app.js后自动插入:

 app.use(expressSession({ secret: 's3cretc0de', store: new MongoStore({ url: mongoUrl }, function () { console.log("db session connection open"); }) })); 

我在路由器中添加了tokenusername段,如下所示:

 router.get('/verify', function(req, res) { req.session.username = username; req.session.token = req.query.token; } 

我错过了什么吗? 任何帮助将不胜感激。

当你使用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; });