如何使用Express和MongoStore从MongoDB集合中查找会话

 tttrj 发布于 2023-01-07 13:45

我正在使用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");
    })
}));

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

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

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有