Passport-Local-Mongoose - Когда я обновляю имя пользователя записи, я выхожу из системы, почему?
Я использую 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 ответ
Решение
Причиной такого поведения является реализация сериализации / десериализации, поставляемая с 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);
}
};