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

时间:2012-03-20 04:17:43

标签: node.js mongodb connect express

我正在为我的mongo数据库构建一个restful api,我正在尝试根据通过api调用发送的SID重新加载用户会话。 我的服务器服务器服务很好,但我不能为我的生活找出如何通过connect-mongo将会话重新加载到req.session并在请求发送后再次保存(基于原始sid)进行。

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

我可以毫无困难地编写一些内容来保存从数据库中提取的会话数据,但我认为有一种方法可以让它通过expressjs或connect-mongo自动处理。

2 个答案:

答案 0 :(得分:0)

那应该有用。之前用它与Redis会话存储区一起使用。

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

答案 1 :(得分:0)

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

查看Patrick的代码让我觉得这可能是某种范围/绑定问题。通过几次调整,我终于能够通过在快速会话之外创建我的mongoStore Obj然后将该obj传递给express.session来访问connect-mongo prototyped函数。

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本身有什么可能。

还要感谢帕特里克的想法,这无疑帮助我思考了正确的方向。

希望这有助于某人!