Passport-Local-Mongoose - 当我更新记录的用户名时,我已经注销了,为什么?

时间:2014-06-03 19:31:12

标签: node.js mongoose passport.js mongoose-plugins

我正在使用带护照的MEAN堆栈和Passport-Local-Mongoose插件。但是,每当我更新用户记录的用户名时,我都会退出当前会话。使用Passport-Local-Mongoose更新用户名的正确方法是什么?

// Update User -- Tied to Usernames or will log out
exports.update = function(req, res) {
    user     = req.user;
    user     = _.extend(user, req.body);
    user.save(function(err, user) {
                if(err) { 
                    console.log(err); 
                    // Error handling for uniqueness violations
                    if (err.code === 11001) {
                        if (err.err.indexOf("email") != -1) {
                            return next(new Error("Email Address Already In Use"));
                        } else if (err.err.indexOf("username") != -1) {
                            return next(new Error("Username Already In Use"));
                        }
                    }
                };
     });
};

1 个答案:

答案 0 :(得分:3)

此行为的原因是passport-local-mongoose附带的序列化/反序列化实现:

schema.statics.serializeUser = function() {
    return function(user, cb) {
        cb(null, user.get(options.usernameField));
    }
};

schema.statics.deserializeUser = function() {
    var self = this;

    return function(username, cb) {
        self.findByUsername(username, cb);
    }
};

此实现使用username字段进行序列化和反序列化。因此,如果用户名值发生​​更改,则用户名的更改将失败。您可以使用这样的自定义序列化/反序列化策略来阻止此行为:

schema.statics.serializeUser = function() {
    return function(user, cb) {
        cb(null, user.id);
    }
};

schema.statics.deserializeUser = function() {
    var self = this;

    return function(id, cb) {
        self.findOne(id, cb);
    }
};