0

I am trying to use Passportjs with Node.js and MySQL.

I get this error:

Failed to deserialize user out of session

In registration code I have this:

app.post("/register", function(req, res){
            var hash = bcrypt.hashSync(req.body.password);
            var q = "INSERT INTO users (username, email, hash) VALUES ('" + req.body.username +"','" + req.body.email +"','"+ hash +"')";
              connection.query(q, function(err, result) {
                if (err){
                res.redirect("/register");
                }else{
                  connection.query('SELECT * FROM users WHERE id = LAST_INSERT_ID()', 
                  function(err, result){
                    var user = result[0]; 
                    req.login(user, function(err){
                        res.redirect('/');
                       });
                  });    
                }
          });
});

In LocalStrategy I have this:

passport.use(new LocalStrategy(
  function(username, password, done) {
      var q = "SELECT username AS username, hash AS hash, id AS id FROM users WHERE username ='"+ [username] +"'";
      connection.query(q, function(err, result) {
                var hash = result[0].hash;
                var isValid = bcrypt.compareSync(password, hash);
                if (err) throw err;
                if (isValid){
                     //redirect back to index
                    return done(null,{user:result[0]}); 
                } else {
                    return done(null,false);
                }
  });
   }
));

I believe this is where I am going wrong but I can't figure it out, in serialize and deserialize I have this:

passport.serializeUser(function(user, done) {
  done(null, user.id);
}); //store id in session

passport.deserializeUser(function(id, done) {
    connection.query("SELECT * FROM users WHERE id ='"+id+"'",function(err,rows){   
            done(err, rows[0]);
        });

}); 
MG91
  • 193
  • 1
  • 11

1 Answers1

0

I finally figured it out after 2 days of trying to fix it. in user registration I should have stored the user id as a variable like this

   var user = result[0].id; 
     req.login(user, function(err){
       res.redirect('/');
    });

and in localstrategy where the user logs in

var user = result[0].id;
return done(null,user);

I am new to this and I googled :Understanding passport serialize deserialize. Then I found this post and it was very helpful.
Hope this helps others.

MG91
  • 193
  • 1
  • 11