访问 req.session.variable 方法时出错

Error accessing req.session.variable method

我在访问路由时添加了一个自定义对象 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();

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

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

谢谢

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

自定义class/object不会直接序列化和反序列化to/fromJSON,这意味着您必须检查您正在使用的会话存储是否提供功能"hook"(反)序列化。

例如,您可以将 connect-mongo has serialize/unserialize 选项用于此目的,想法是您 "convert" 您的 class 实例到 JSON-可序列化的东西,并在反序列化期间将 "something" 转换回 class.

的实例

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

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

编辑:这是connect-mongo的一个(未经测试的)示例。我正在使用 serialise 轻松创建 JSON-stringiable 版本的 class。这可能适用于您的特定情况,也可能不适用于 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 不是很熟悉),但希望它能让您了解如何实现它。