如何使用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。
此外,我的sessions
logging被添加到我的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; }
我错过了什么吗? 任何帮助将不胜感激。
当你使用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; });