javascript - 为什么我需要在每次请求时使用 PassportJS 反序列化用户?

标签 javascript node.js express passport.js

我确信会有一个明显的答案,但我在官方文档和互联网上都没有找到任何解决方案。

对于Passport.js,我们必须定义两种方法,一种用于序列化,另一种用于反序列化用户 session 。

来自official documentation我读到:

Only the user ID is serialized to the session, keeping the amount of data stored within the session small. When subsequent requests are received, this ID is used to find the user, which will be restored to req.user

我的第一个问题涉及术语“序列化”,根据 Wikipedia :

Serialization is the process of translating data structures or object state into a format that can be stored

但是在一个完全由 Javascript 构建的世界中,既然用户是对象,而对象是原生的,那么我们为什么要序列化呢?我们可以将整个对象存储在 session 中,什么禁止它?

然后,反序列化是一个需要大量消耗资源的过程,因为与数据库交互。那么,为什么要根据任何请求执行反序列化呢?难道我们不能只执行一次并保留结果以供进一步请求吗?

我读了很多关于PassportJS的内容,并且我能够实现一个登录系统,但我想澄清这些晦涩的方面。 谢谢。

最佳答案

正如您所说, session 中唯一保留的用户数据是用户 ID。如果您想缓存用户 ID 的反序列化,那么您必须自己维护它(大概在内存中,因为您担心检索数据的时间)。这样做的问题是,您必须在更新用户的任何操作(可能用户更改其电子邮件地址或密码)上使缓存失效/更新,否则您将面临 req.user 上的数据过时的风险.

您暗示您正在使用数据库(而不是像 Redis 这样的内存存储),并且担心每次请求时从数据库获取用户的性能影响。如果不了解更多关于您的特定设置的信息,就不可能确定,但​​我认为您的担忧可能是没有根据的 - 一次调用即可根据 ID 获取用户记录(哪些数据库对此进行了很好的优化 - 主键索引)例如基于 SQL 的数据库)不应给请求增加任何明显的延迟。

关于javascript - 为什么我需要在每次请求时使用 PassportJS 反序列化用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40072353/

相关文章:

javascript - AngularJS 服务(更新/保存)

运行时钟(日期和时间)快四倍的 JavaScript 代码

javascript - Meteor.js + 外部 Mongo。 Meteor 无法登录 Mongo

javascript - Node JS + Passport 登录

javascript - 无法将 undefined 或 null 转换为 Function.keys 处的对象

node.js - 无论如何都无法删除传递了 "email"和 "_id"的文档

node.js - 在node.js中捕获请求url

javascript - HTML表格-为每个<td>创建弹出框并显示xml数据

javascript - Angular nvd3折线图长度

node.js express + aws elb - 从 http 重定向到 https 不起作用