【问题标题】:Express session won't persist, even with MongoStore using connect-mongo即使 MongoStore 使用 connect-mongo,Express 会话也不会持续存在
【发布时间】:2018-03-30 20:31:04
【问题描述】:

当我重新启动服务器时,我的会话结束并退出。这不会在常规页面刷新时发生。我正在使用 connect-mongo 来解决这个问题:

var session = require('express-session'); const MongoStore = require('connect-mongo')(session);

这是我用来存储会话的代码,重用了一个名为 thisDb 的现有 Mongo 连接:

app.use(session({                                
        secret: secretHash,
        saveUninitialized: true,
        resave: true,
        secure: false,
        store: new MongoStore({ db: thisDb })
}));

在成功登录期间:

var day = 60000*60*24;
req.session.expires = new Date(Date.now() + (30*day));          
req.session.cookie.maxAge = (30*day);  

在我的 Mongo shell 中,我可以验证登录时是否创建了一个新会话:

db.sessions.find()

{"cookie":{"originalMaxAge":2592000000,"expires":"2017-11-17T20:36:12.777Z","httpOnly":true,"path":"/"},"user":{"newNotifications":false,"username":"max","admin":"true","moderator":"true"},"expires":"2017-11-17T20:36:10.556Z"}

【问题讨论】:

  • 什么时候重启你的服务器?你的意思是当你终止你的nodejs应用程序时?当你关闭服务器并再次运行它时,你能告诉我们你从db.sessions.find()得到什么吗?
  • @turmuka - 是的,当我终止/重新启动我的节点应用程序或对我的代码进行任何更改时,因为我使用的是 Nodemon,它会为我重新启动服务器。这里有两个db.sessions.find() 调用,第一个是在我登录时,第二个是在重新启动服务器后(让我退出):
  • > db.sessions.find()[0] { "_id" : "ZFGZJL9yc2Z3D7eI-SI7pifnyvVbmSLl", "session" : "{\"cookie\":{\"originalMaxAge\":2592000000 ,\"expires\":\"2017-11-17T21:29:21.872Z\",\"httpOnly\":true,\"path\":\"/\"},\"user\":{ \"newNotifications\":false,\"username\":\"max\",\"admin\":\"true\",\"moderator\":\"true\"},\"expires\" :\"2017-11-17T21:29:21.845Z\"}", "expires" : ISODate("2017-11-17T21:29:21.872Z") }
  • > db.sessions.find()[0] { "_id" : "ZFGZJL9yc2Z3D7eI-SI7pifnyvVbmSLl", "session" : "{\"cookie\":{\"originalMaxAge\":2592000000 ,\"expires\":\"2017-11-17T21:29:21.872Z\",\"httpOnly\":true,\"path\":\"/\"},\"user\":{ \"newNotifications\":false,\"username\":\"max\",\"admin\":\"true\",\"moderator\":\"true\"},\"expires\" :\"2017-11-17T21:29:21.845Z\"}", "expires" : ISODate("2017-11-17T21:29:21.872Z") }
  • 我真的不知道。也许您的服务器在退出时向您的客户端发送一条消息,表明它不再存在,并且您的浏览器删除了 cookie?也许您应该检查浏览器上的 cookie。还要尝试将这些额外信息放在您的问题中,而不是在这里。请下次编辑。

标签: node.js mongodb session express-session connect-mongo


【解决方案1】:

好吧,差不多 3 年后,我遇到了这个问题。不知道 OP 是否在使用 Passport,但我通过将这个函数从 passport.use 函数内部移到外部解决了这个问题:

passport.serializeUser(function(user, done){
    done(null,user.id);
});

passport.deserializeUser((id,done) => {
    User.findById(id, (err,user) => {
        done(null,user);
    });
});

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2021-10-20
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2020-04-08
    • 2020-12-14
    相关资源
    最近更新 更多