如何根据 sid 重新加载会话? (expressjs 和 connect-mongo)

问题描述 投票:0回答:2

我正在为我的 mongo 数据库构建一个 Restful api,并尝试根据通过 api 调用发送的 SID 重新加载用户会话。 我的服务器可以很好地提供会话,但我一生都无法弄清楚如何通过 connect-mongo 将会话重新加载到 req.session 中,并在发送请求后再次保存它(基于原始 sid)出来了。

我保存到 req.session 的任何内容都会被放入一个全新的会话中,并且不会写入我之前的会话数据。

我可以轻松地编写一些东西来保存从数据库中提取的会话数据,但我认为有一种方法必须由expressjs或connect-mongo自动处理它。

node.js mongodb express connect-mongo
2个回答
0
投票

这应该可行。之前将其与 Redis 会话存储一起使用。

var self = this;
sid = decodeURIComponent(this.user.cookie['connect.sid']);
MongoStore.get(sid, function(err, session) {
  return self.session = session;
  ...
});

0
投票

我最终解决了我的问题,尽管我认为我的很多头痛都与我对如何处理会话的不了解有关。虽然这不是我最终想要的,但它最终给了我基本上相同的结果。

查看帕特里克的代码让我想到这可能是某种范围/绑定问题。经过一些调整,我终于能够通过在express会话之外创建我的mongoStore Obj然后将该obj传递到express.session来访问connect-mongo原型函数。

MongoStore = require('connect-mongo')
var mongoSession = new MongoStore(conf.db);

//Configure Session Db
var conf = {
  db: {
    db: 'sessions',
    host: '127.0.0.1',
  },
  secret: 'kittens'
};

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');      
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({
    secret: conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: mongoSession
  }));
  app.use(allowCrossDomain);
  app.use(require('stylus').middleware({ src: __dirname + '/public' }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));


});

现在我可以通过 mongostore obj 轻松获取/设置以前的会话。我知道可能还有其他方法可以做同样的事情(即直接访问 mongodb),尽管我想看看简单地使用 mongostore obj 本身可以实现什么。

也感谢您对帕特里克的想法,绝对帮助我朝正确的方向思考。

希望这对某人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.