我确信会有一个明显的答案,但我既没有在官方文档中找到任何解决方案,也没有找到任何解决方案。
使用 Passport.js ,我们必须定义两个方法,一个用于序列化,另一个用于反序列化用户会话。
只有用户ID被序列化到会话中,使会话中存储的数据量保持较小。收到后续请求时,将使用此ID查找用户,该用户将还原到req.user
根据Wikipedia,我的第一个问题涉及序列化一词:
序列化是将数据结构或对象状态转换为可以存储的格式的过程
但是在一个完全由Javascript制作的世界中,由于用户是对象和对象是原生的,为什么我们要序列化?我们可以将整个对象存储在会话中,是什么禁止它?
然后,反序列化是一个需要大量消耗资源的过程,因为它与数据库交互。那么,为什么要在任何请求下执行反序列化呢?我们不能只做一次并保留结果以进一步请求吗?
我阅读了很多关于 PassportJS 的内容,并且我能够实现登录系统,但我想澄清这些不起眼的方面。 谢谢。
答案 0 :(得分:0)
正如您所说,会话中持久存在的唯一用户数据是用户ID。如果您想将用户ID的反序列化缓存到用户,那么您必须自己维护(大概是在内存中,因为您关注检索数据的时间)。这样做的问题是,您必须在更新用户的任何操作(可能是用户更改其电子邮件地址或密码)上使该缓存无效/更新,否则您可能会在req.user
上过期数据。
您暗示您正在使用数据库(而不是像Redis这样的内存存储库),并且担心每次请求时从数据库中获取用户的性能影响。如果不了解更多有关您的特定设置的情况,我们无法确定,但我认为您的担忧可能是没有根据的 - 根据ID获取用户记录的一次调用(这些数据库已针对 - 例如,基于SQL的数据库上的主键索引不应该为请求添加任何重要的延迟。