什么时候是序列化和反序列化的护照方法? 它究竟设置了什么?

我们有两种types的用户,pipe理员和普通用户。

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

这两个function到底做了什么? 详细的答复表示赞赏。 TIA。

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

在典型的Web应用程序中,仅在login请求期间传输用于authentication用户的凭证。 如果validation成功,会话将通过在用户浏览器中设置的cookie来build立和维护。

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

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

为了让开发者能够自由地使用他们想要的任何数据库,不pipe他们想要序列化的数据是什么,他们都可以用自己的方式来完成,序列化和反序列化逻辑是我们要实现的。

serializeUser是在login请求(身份validation期间)调用的方法,如果login成功,则会决定在会话中应存储哪些用户信息,并将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附加到请求,使得它可以在我们的请求处理中访问。

这里是解释它非常好的文章