如何在用户数据发生变化时启动serializeUser方法?

时间:2015-06-17 14:31:43

标签: mongodb mongoose passport.js passport-local

我使用passportjspassport-local策略来验证项目中的用户。官方serializeUser deserializeUser方法如下:

// serialize and deserialize
passport.serializeUser(function(user, done) {
   done(null, user._id);
});

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

但由于性能原因,我需要阻止查询User.findById到我的MongoDB数据库,所以我使用以下方法:

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

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

但是现在我想出了以下问题:如果用户更改了他们的数据,如姓名,年龄等,该怎么办?如何在不注销的情况下更新这些数据?

实际上我需要手动执行passport.serializeUser一些方法吗?

1 个答案:

答案 0 :(得分:0)

如果您正在使用数据库会话存储,那么您仍然只是在每次user.toJSON()调用时从数据库中检索整个deserializeUser,这是您认为您正在避免的但实际上是不。

如果您没有使用数据库会话存储,那么您可能将它全部存储在cookie中或者看起来非常不安全的地方,因为用户对象可能包含密码哈希等敏感信息。

如果您只想将用户存储在内存中,您应该这样做。创建一个包含用户对象的缓存。

var Users = {};

passport.serializeUser(function(user, done) {
    Users[user._id] = user; // store in cache
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {
    if(Users[id]) return done(null, Users[id]); // retrieve from cache
    User.findById(id, function(err, user){
        if(err) return done(err);
        Users[id] = user; // store in cache now if wasn't already found
        done(null, user);
    });
});