什么时候调用序列化和反序列化护照方法?它具体设置了什么?

When is the serialize and deserialize passport method called? What does it exactly set?

我们有两种类型的用户,管理员用户和普通用户。

passport.serializeUser(function(user, done) {
  console.log('Sear');
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log(id);
  console.log("Deser");
  User.findById(id, function(err, user) {
    if(err) done(err);
    if(user){
      done(null, user);  
    }else{
       vendorUser.findById(id, function(err, user){
        if(err) done(err);
        done(null,user);
       });
    }
  });
});

Console.log 频繁输出(即使是在单个 API 请求中)和文本

Deser

这两个函数到底有什么作用?一个详细的答案表示赞赏。 TIA.

序列化和反序列化是重要的概念。 序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。

在典型的 Web 应用程序中,用于验证用户身份的凭据只会在登录请求期间传输。如果身份验证成功,将通过用户浏览器中设置的 cookie 建立和维护会话。

每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。 为了支持登录会话,Passport 将序列化和反序列化用户实例到会话中和从会话中反序列化。

在您编写的代码中,只有用户 ID 被序列化到会话中。后续收到请求时,使用该ID查找用户,恢复为req.user.

为了给开发者自由,用户想用什么数据库,想序列化什么数据,都可以按照自己的方式去做,序列化和反序列化的逻辑就交给我们来实现了。

serializeUser 是在登录请求时调用的方法(在身份验证期间),如果登录成功,则它决定应将哪些用户信息存储在会话中,并将 cookie 发送到浏览器同样保持会话。

// Only during the authentication to specify what user information should be stored in the session.
passport.serializeUser(function (user, done) {
    console.log("Serializer : ", user)
    done(null, user.id);
});

上面的代码片段会将 user.id 字段保存到会话和 cookie 中。

deserializeUser 是在所有后续请求上调用的方法,由 passport.session 中间件调用。它使我们能够在每个请求上加载额外的用户信息。此用户对象作为 req.user 附加到请求,使其在我们的请求处理中可访问。

Here is解释它的文章很流畅