我正在为我的 mongo 数据库构建一个 Restful api,并尝试根据通过 api 调用发送的 SID 重新加载用户会话。 我的服务器可以很好地提供会话,但我一生都无法弄清楚如何通过 connect-mongo 将会话重新加载到 req.session 中,并在发送请求后再次保存它(基于原始 sid)出来了。
我保存到 req.session 的任何内容都会被放入一个全新的会话中,并且不会写入我之前的会话数据。
我可以轻松地编写一些东西来保存从数据库中提取的会话数据,但我认为有一种方法必须由expressjs或connect-mongo自动处理它。
这应该可行。之前将其与 Redis 会话存储一起使用。
var self = this;
sid = decodeURIComponent(this.user.cookie['connect.sid']);
MongoStore.get(sid, function(err, session) {
return self.session = session;
...
});
我最终解决了我的问题,尽管我认为我的很多头痛都与我对如何处理会话的不了解有关。虽然这不是我最终想要的,但它最终给了我基本上相同的结果。
查看帕特里克的代码让我想到这可能是某种范围/绑定问题。经过一些调整,我终于能够通过在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 本身可以实现什么。
也感谢您对帕特里克的想法,绝对帮助我朝正确的方向思考。
希望这对某人有帮助!