【问题标题】:Express load Session from Mongo with session_id使用 session_id 从 Mongo 快速加载会话
【发布时间】:2014-04-21 09:26:18
【问题描述】:

嘿,

我正在构建一个(半)REST API,以 Nodejs/Express 作为后面,Phonegap/Cordova 作为前面。 对于后端,我使用expressconnect-mongomongoose,如下所示:

express.cookieParser(),
express.session({
    secret: nconf.get('session:salt'),
    store: new mongoStore({url: nconf.get('database').url})
}),

对于节点上的会话验证,我在 route.js 文件中创建了以下函数

var authenticate = function (req, res, next) {

if (req.session.user)
    next();
else
    res.error('access is not authentication');
}

很遗憾,PhoneGap 和 Cordova 不支持开箱即用的 cookie,所以我使用 localStorage 存储 session_id 并包装每个服务器调用以将其聚合到 url 参数。

有没有什么优雅的方法可以通过 'session_id' 参数在我的 authenticate 函数中从 mongoDB 预加载会话,而无需为会话集合创建 Schema 并尝试使用 mongoose 查询它?

干杯,

-PK。

【问题讨论】:

    标签: node.js mongodb session cordova mongoose


    【解决方案1】:

    使用mongoStorestore.get 方法。试试这样的:

    var authenticate = function (req, res, next) {
      mongoStore.get(req.params.session_id, function (error, session) {
        if (error) {
          res.status(500).send(error);
          return;
        }
      }
      req.session = session;
      next();
    }
    

    【讨论】:

    • 不幸的是,序列化的会话与connect-mongo 注入的会话对象不同,所以如果我将上述内容用作在express.session({ secret: nconf.get('session:salt'), cookie: {secure: false, maxAge: 300000}, store: mStore }) 之后调用的中间件,如果我反转,则会出现异常中间件顺序,因此它将在 connect-mongo 之前反序列化,然后它将注入并覆盖我加载的会话对象。捕获 22。
    • 这里更准确地说是反序列化失败作为一个要点gist.github.com/kaminskypavel/e4f19bdb43899fa09389
    • 是的,您必须按照 connect 期望的方式在其中放置一个真实的会话实例。虽然我不知道这些细节,所以我无法在这方面提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2012-12-16
    • 2015-09-08
    • 2021-11-11
    相关资源
    最近更新 更多