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

时间:2014-10-02 19:48:55

标签: node.js session serialization passport.js

我对会话的作用只有最隐蔽的概念,the official documentation does not help much,因为它假设我知道会话是什么,因此也知道为什么用户需要序列化和反序列化。

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

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

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

以下代码如何丢弃便利贴? findByID访问我存储用户的数组。如果'发布便笺'为什么需要访问它?只会被扔掉?

passport.deserializeUser(function(id, done) {
  findById(id, function (err, user) {
    done(err, user);
  });
});

究竟是什么流程?

这些示例的其余代码是here

1 个答案:

答案 0 :(得分:7)

你用冰箱比喻中途到了一半。会话确实像一个便利贴,但你写下你想要的东西。序列化是写作部分,反序列化是阅读部分。

因此,您的用户就会登录。您不希望将所有信息保留在会话中,因为它已经在您的数据库中。但是在随后的请求中,你想要记住他是谁。所以你必须写下你的帖子 - 这是他的身份证明,让我们说1234.通过致电完成,你告知护照这是你想要在会议中存货的。

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

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

希望这有帮助。