在使用护照和快递的会话中,序列化和去序列化究竟做了什么?

Tar*_*oys 3 session serialization node.js passport.js

我对会话的作用只有最危险的概念,官方文档没有多大帮助,因为它假定我知道会话是什么,因此也知道为什么用户需要序列化和反序列化.

这就是我认为我所知道的:一个会话就像贴在服务器冰箱上的便利贴,上面写着"用户鲍勃很酷.让他进来吧." 每次来自bob的新请求时,服务器都会检查post-it节点并说:"是的.Bob仍然很酷."

因此序列化正在编写便利贴,反序列化正在将其删除.这就是我不明白的地方:这段代码如何编写一个post-it节点,"做"了什么?

passport.serializeUser(function(user, done) {
  done(null, user.id);
});
Run Code Online (Sandbox Code Playgroud)

以下代码如何丢弃便利贴?findByID访问我存储用户的数组.如果"后贴注"刚刚被丢弃,为什么需要访问它?

passport.deserializeUser(function(id, done) {
  findById(id, function (err, user) {
    done(err, user);
  });
});
Run Code Online (Sandbox Code Playgroud)

究竟是什么流程呢?

这些示例的其余代码就在这里

小智 8

你的冰箱比喻就在那里.会话确实像一个便利贴,但你写下你想要的东西.序列化是写作部分,反序列化是阅读部分.

所以您的用户登录.您不希望将所有信息保留在会话中,因为它已经在您的数据库中.但是在随后的请求中,你想要记住他是谁.所以你必须写下你的帖子 - 这是他的身份证,比方说1234.通过调用已完成,你告知护照这是你想要在会话中存储的内容.

在随后的电话中,护照会检索你的帖子并说"好的,我知道这个人,他的身份证是1234".findById是您调用以检索其所有信息的方法,例如他的名字.通过在这里调用完成,你说"好的,这是关于该用户的信息.他的名字是鲍勃."

如果您想知道为什么要调用完成而不是简单地返回值,那是因为序列化和反序列化都可能是异步的.如果您想了解有关异步代码的更多信息,我强烈建议您以正确的方式阅读Node,因为它是Node.js的核心概念.

希望这可以帮助.