【问题标题】:What exactly does serialize and deseralize do in sessions with passport and express?在使用护照和快递的会话中,序列化和反序列化究竟做了什么?
【发布时间】:2014-11-27 21:28:37
【问题描述】:

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

以下是我认为我所知道的:会话就像一张贴在服务器冰箱上的便利贴,上面写着“用户 bob 很酷。让他进来。”每次来自 bob 的新请求时,服务器都会检查便利贴节点并说:“是的。Bob 仍然很酷。”

所以序列化是写便利贴,反序列化是把它记下来。这就是我不明白的:这段代码如何写一个便利贴节点,“完成”在做什么?

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

下面的代码是如何丢弃便利贴的? findByID 访问我存储用户的数组。如果“便利贴”即将被丢弃,为什么还需要访问它?

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

这里的流量到底是什么?

这些示例的其余代码是here

【问题讨论】:

    标签: node.js session serialization passport.js


    【解决方案1】:

    你的冰箱类比已经成功了一半。会话确实就像一个便利贴,但你在上面写下你想要的。序列化是写入部分,反序列化是读取部分。

    所以你的用户登录了。你不想在会话中保留他的所有信息,因为它已经在你的数据库中。但是在随后的请求中,您想记住他是谁。所以你只需要在你的便利贴上写下他的身份证,比如 1234。通过调用完成,你是在告诉护照这是你想在会话中储存的东西。

    在随后的电话中,护照会检索您的便利贴并说“好的,我认识这个人,他的 id 是 1234”。 findById 是您调用以检索他的所有信息(例如他的姓名)的方法。通过在此处调用 done,您是在说“好的,这是有关该用户的信息。他的名字是 Bob。”

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 2021-10-16
      • 2023-03-24
      • 2016-04-13
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2014-06-22
      相关资源
      最近更新 更多