访问 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
不是很熟悉),但希望它能让您了解如何实现它。
我在访问路由时添加了一个自定义对象 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
不是很熟悉),但希望它能让您了解如何实现它。