在关于passportjs的大多数示例中,建议使用deserializUser
方法查找应用程序用户存储,例如:
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (user, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
我跟踪并发现每个页面都调用deserializeUser
方法,而serializeUser
只在身份验证后调用一次。
在serializeUser
查询数据库并传递作为对象所需的任何详细信息不是更有效率,然后deserializeUser
可以将其传递给req.user
吗?
答案 0 :(得分:0)
serializeUser
和deserializeUser
用于在实际用户对象与用户会话中的任何对象之间创建映射。
因此,当用户登录时,您需要为其创建会话,因此用户对象将传递给serializeUser
,它决定在会话中存储什么,以便以后可以检索用户。在您的情况下,它只使用id
的{{1}}。
之后,对于每个请求,首先从会话中检索用户的id,然后使用user
函数,它将转换为实际用户对象以存储在deserializeUser
中。
您还可以以不需要数据库查询的方式编写序列化函数。例如,您可以将整个用户对象序列化到会话中:
req.user
但请记住,如果用户对象中的任何内容在登录后发生更改,则不会反映在passport.serializeUser(function (user, done) {
done(null, JSON.stringify(user));
});
passport.deserializeUser(function (user, done) {
done(err, JSON.parse(user));
});
上。
与实际应用程序逻辑相比,序列化功能的数据库查询开销通常无关紧要。我建议用你已经拥有的东西。它不太可能导致任何性能问题。
我在几个生产项目中有同样的事情,从未遇到过任何问题。