我有一个已登录的用户对象,我将其推送到我的会话中。user 对象是一个 sequelize user 对象实例,它上面有很多有用的方法。
当我从会话中读回对象时,我现在所拥有的只是我的对象的 json 表示。所有有用的方法都没有了。
节点问题:是否可以将完整对象放入会话中,而不仅仅是 json 表示?
Sequelize 问题:拥有一个对象的 json 表示,是否可以构造一个完整的 sequelize 对象而无需重新查询?
我有一个已登录的用户对象,我将其推送到我的会话中。user 对象是一个 sequelize user 对象实例,它上面有很多有用的方法。
当我从会话中读回对象时,我现在所拥有的只是我的对象的 json 表示。所有有用的方法都没有了。
节点问题:是否可以将完整对象放入会话中,而不仅仅是 json 表示?
Sequelize 问题:拥有一个对象的 json 表示,是否可以构造一个完整的 sequelize 对象而无需重新查询?
您可以分离对象函数和数据,例如:
user.prototype.methods = userMethods;
user.prototype.data = req.session.userData
function userMethods(){
}
我们在谈论什么样的会议?
对于 cookie 会话:对所有内容进行序列化将使客户端的标头变得庞大(慢/大请求),并且每个请求都会给您的服务器带来更多负担。
对于数据库支持的会话:您在 cookie 中存储了一个小的会话 ID,那么无论如何您都必须在数据库中查询会话对象。
使用该查询来获取完整的用户对象,方法是将用户 ID 保存在 cookie 中,而不是会话 ID。
最后一个选项:
sequelize
. 我没有使用过那个 ORM,但是我使用过的其他 ORM 东西(猫鼬)可以让您从对象的数据中实例化一个对象,这将使您能够访问您再次缺少的所有有用方法。编辑:从文档中,我认为您可以获取保存在会话(session.user
)中的 JSON,然后像这样恢复用户实例:
var restoredUserInstance = MyUserModel.build(session.user);
由于您的用户模型的 JSON 可能包含您的主键(电子邮件或用户名或其他内容),因此您可以 restoredUserInstance.save()
按预期使用所有其他方法(保存将更新等)如果这不起作用,请告诉我,我们可以进一步挖掘文档/代码。
我看了看,发现以下关于如何在不调用数据库的情况下从 JSON 实例化实例的说明find()
:https ://github.com/sdepold/sequelize/issues/191