0

Passport と Passport-Local-Mongoose プラグインで MEAN スタックを使用しています。ただし、ユーザー レコードのユーザー名を更新するたびに、現在のセッションからログアウトされます。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"));
                        }
                    }
                };
     });
};
4

1 に答える 1

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);
    }
};
于 2014-08-06T13:24:52.600 に答える