可以在serializeUser而不是deserializeUser上完成用户的数据库查找吗?

时间:2017-02-01 09:54:30

标签: node.js passport.js

在关于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吗?

1 个答案:

答案 0 :(得分:0)

serializeUserdeserializeUser用于在实际用户对象与用户会话中的任何对象之间创建映射。

因此,当用户登录时,您需要为其创建会话,因此用户对象将传递给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)); }); 上。

与实际应用程序逻辑相比,序列化功能的数据库查询开销通常无关紧要。我建议用你已经拥有的东西。它不太可能导致任何性能问题。

我在几个生产项目中有同样的事情,从未遇到过任何问题。

另请阅读:Understanding passport serialize deserialize