'Passport / node.js : Failed to serialize user into session

As a beginner I was following a tutorial to make my first website with node.js but when I try to test a login with 100% valid information I get the following error: Error: Failed to serialize user into session Something weird I found is that when the error pops up I go back to the previous page, in this case the login page, and a welcome message I added on /profile.hbs/ pops up as if I was in a session.

This is my passport.js

const res = require('express/lib/response');
const passport = require('passport');
const pool = require('../database');
const router = require('../routes/usuario');
const LocalStrategy = require('passport-local').Strategy;

//const helpers = require('../lib/helpers')

passport.use('local.signin', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
}, async (req, username, password, done) => {
    
    const rows = await pool.query('SELECT * FROM userr WHERE username = ?', [username])
    if (rows.length > 0) {
        const user = rows[0];
        const validPassword = user.password == password
        if (validPassword) {
            done(null, user, req.flash('success', 'Bienvenido, ' + user.username))
        }else{
            done(null, false, req.flash('message', 'Contraseña incorrecta'))
        }
    } else {
        return done(null, false, req.flash('message', 'El usuario no existe'))
    }
}));



passport.use('local.signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
}, async (req, username, password, done) => {    
    const newUser = {
        username: username,
        password: password
    };
    //newUser.password = await helpers.encryptPassword(password);
    const result = await pool.query('INSERT INTO userr SET ?', [newUser])
    newUser.id_user = result.insertId;
    return done(null, newUser);

}));

passport.serializeUser((user, done) => {
    console.log(user)
    done(null, user.id_user)
});

passport.deserializeUser(async (id_user, done) => {
     const rows = await pool.query('SELECT * FROM userr WHERE ID = ?', [id_user]);
     done(null, rows[0]);
});

And this is my authentication.js

const express = require('express');
const router = express.Router();
const passport = require('passport');
const { route } = require('./usuario');


router.get('/signup', (req, res) => {
    res.render('auth/signup')
}); 

router.post('/signup', passport.authenticate('local.signup', {
    successRedirect: '/profile',
    failureRedirect: '/signup',
    failureFlash: true

    }));


router.get('/signin', (req, res) => {
    res.render('auth/signin')
});

router.post('/signin', (req, res, next) => {
    passport.authenticate('local.signin',{
        successRedirect: '/profile',
        failureRedirect: '/signin',
        failureFlash: true
    })(req, res, next);
})


router.get('/profile', (req, res) => {
    res.render('profile');
});

module.exports = router;

I tried to use a different route, I forced out a session (it worked with a deserialize error I had), I redid the login step with completely different variables and a different database but I still got the same response.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source