【问题标题】:Error accessing req.session.variable method访问 req.session.variable 方法时出错
【发布时间】:2018-08-22 21:50:34
【问题描述】:

如果我有一个登录用户,我在访问我的 req.session 的路由时添加了一个自定义对象,我正在使用护照和快递。

router.get('/', function(req,res) {
  if((!req.session.myObject) && (req.isAuthenticated())) {
    req.session.myOBject = new myObject();
  }
});

但是如果我这样做了,那么在另一条路线上

req.session.myObject.myMethod() 

我收到一个错误,表明 myObject.myMethod 不是函数,而如果在该路线中我运行

var myObject = new Object();
myObject.myMethod();

它有效,但显然我不想在那里创建一个新对象,我希望在我第一次查看根页面并登录时创建 1 个 myObject。

为什么会出现这个错误????我该如何绕过它???

谢谢

【问题讨论】:

    标签: express passport.js express-session


    【解决方案1】:

    express-session 的会话存储通常在请求之间将会话数据存储为 JSON。

    自定义类/对象不会直接与 JSON 进行序列化和反序列化,这意味着您必须检查您正在使用的会话存储是否提供“挂钩”(反)序列化的功能。

    例如,connect-mongo 具有可用于此目的的 serialize/unserialize 选项,其想法是您将类实例“转换”为可序列化 JSON 的东西,并在反序列化期间将该“东西”转换回到你的类的一个实例。

    或者,您可以在您的类中定义 toJSON 方法来序列化实例,并使用常规 Express 中间件将此数据转换回实例。

    所有这一切的结果是为每个请求创建类的新实例。我不知道你怎么能解决这个问题。

    编辑:这是connect-mongo 的(未经测试的)示例。我正在使用 serialise 轻松创建您的课程的 JSON 可字符串化版本。这可能适用于您的特定情况,也可能不适用,所以 YMMV。

    // Load `serialise` and register your class with it.
    const S = require('serialise');
    S.serialisable(myObject);
    
    // Create the `connect-mongo` session store instance
    let store = new MongoStore({
      ...,
      serialize : session => {
        session.myObject = S.serialise(session.myObject);
        return session;
      },
      unserialize: session => {
        session.myObject = S.deserialise(session.myObject);
        return session;
      }
    });
    

    同样,上面的代码未经测试,可能会失败(我对connect-mongo 并不熟悉),但希望它能让您了解如何实现。

    【讨论】:

    • 谢谢罗伯特,我其实用的是connect-mongo,能不能给我举个例子说明如何使用序列化/反序列化,不知道怎么实现。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多