Passport-Local-Mongoose – Когда я обновляю имя пользователя записи, я выхожу из системы, почему?

StackOverflow https://stackoverflow.com//questions/24023443

Вопрос

Я использую MEAN stack с passport и плагином 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"));
                        }
                    }
                };
     });
};
Это было полезно?

Решение

Причиной такого поведения является реализация сериализации/десериализации, поставляемая с 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);
    }
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top