Express 访问req.session.variable方法时出错
我在访问req会话的路由时添加了一个自定义对象。如果我在用户中有loggen,我使用的是passport和expressExpress 访问req.session.variable方法时出错,express,passport.js,express-session,Express,Passport.js,Express Session,我在访问req会话的路由时添加了一个自定义对象。如果我在用户中有loggen,我使用的是passport和express router.get('/', function(req,res) { if((!req.session.myObject) && (req.isAuthenticated())) { req.session.myOBject = new myObject(); } }); 但如果我这样做的话,我会选择另一条路线 req.session.my
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,它是在我第一次查看根页面时创建的,并且是loggedIn
为什么我会出现这个错误????我怎样才能避开它
感谢会话存储对于
express Session
通常在请求之间将会话数据存储为JSON
自定义类/对象不会被直接序列化到JSON或从JSON反序列化,这意味着您必须检查您正在使用的会话存储是否提供了“钩住”(反)序列化的功能
例如,具有可用于此目的的选项,其思想是将类实例“转换”为可JSON序列化的对象,并在非序列化期间将该“对象”转换回类实例
或者,您可以在类中定义toJSON
方法来序列化实例,并使用常规的Express中间件将此数据转换回实例
但是,所有这些的结果是为每个请求创建新的类实例。我不明白你怎么能逃避这件事
编辑:下面是一个连接mongo
的(未测试)示例。我正在使用它轻松创建类的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
),但希望它能给你一个如何实现的想法。谢谢Robert,我实际上在使用connect mongo,你能给我一个如何使用serialize/unserialize的示例吗,不知道如何实现它们。