护照将用户序列化为会话

时间:2017-07-22 21:24:14

标签: node.js authentication passport.js

我在尝试登录我的应用时遇到此错误:

错误:无法将用户序列化为会话

问题是它正在读取参数user.id为undefined。如果我将其更改为用户在数据库登录中的id值。

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

有关为什么我将用户值视为未定义的任何想法?

pasport本地登录:

    // =========================================================================
    // LOCAL LOGIN =============================================================
    // =========================================================================
    passport.use(
        'local-login',
        new LocalStrategy({
            usernameField : 'username',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },
        function(req, username, password, done) {
            if(username == "" || password == ""){
                return done(null, false, req.flash('loginMessage', 'Please fill in all blank fields to login.'));
            }else{
                query.login(req, username, password, done);
            }
        })
    );

登录查询:

    login: function(req, username, password, done) {
        connection.query("SELECT * FROM users WHERE username = ?",[username], function(err, rows){
            if (err)
                return done(err);
            if (!rows.length)
                return done(null, false, req.flash('loginMessage', 'Sorry, username/password do not match.')); // req.flash is the way to set flashdata using connect-flash

            // if the user is found but the password is wrong
            if (!bcrypt.compareSync(password, rows[0].password))
                return done(null, false, req.flash('loginMessage', 'Sorry, username/password do not match.')); // create the loginMessage and save it to session as flashdata

            // all is well, return successful user
            return done(null, rows[0]);
        });
    }

登录工作直到我更改了数据库中的某些字段名称,但我使用字段的新名称更新了所有查询,因此我不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

我发现了问题。由于我在我的数据库中将id的字段名称更改为id_users,因此serializeUser函数如下所示:

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