Search code examples
javascriptnode.jsexpresspassport.jsexpress-session

Passport Session Failed to serialize (Bad Gateway)


I am using the following dependencies:

  1. express session
  2. passport
  3. passport-local
  4. passport-local-mongoose

When I try to register a user and they post the data. The data get saved to the database but it give a bad request. Also when I try to use req.user.id in the Tweet.find() it gives undefined and I also console.log(req.user) and it give me undefined. And once a error came that failed to serialize session one or two time. Can anybody help me. Here is some code sorry in advance if this is to much code as I was not sure that which part of the code was important.

//-----------------------//Require---------------------
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const ejs = require("ejs");
const session = require("express-session");
const passport = require("passport");
const LocalStratagy= require("passport-local").Strategy;
const passportLocalMongoose = require("passport-local-mongoose");
const mongoose = require("mongoose");

//-----------------------//App.use---------------------

app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: false
}));
//-----------------------//Passport---------------------

app.use(passport.initialize());
app.use(passport.session());


//-----------------------//Mongoose---------------------
mongoose.connect('mongodb://localhost/Twitter', {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.set('useCreateIndex', true);
const tweetschema = new mongoose.Schema({
    username: String,
    password: String,
    tweets: String
});
//-----------------------//Schema Plgin---------------------

tweetschema.plugin(passportLocalMongoose);

//-----------------------//New Model---------------------

const Tweet = new mongoose.model("Tweet", tweetschema);

//-----------------------//Local Strategy-------------------
passport.use(new LocalStratagy(Tweet.authenticate()));

//-----------------------//Seralize Passport---------------------

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

//-----------------------//Desarlize Passport---------------------
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

app.post("/tweets", bodyParser.urlencoded({extended: true}), (req, res)=>{
    const Gottweets= req.body.tweet;
    console.log(Gottweets);
    console.log(req.user);
   /*  Tweet.findById(req.tweet.id, (err, foundUser)=>{
        if(err){
            console.log(err);
            res.redirect("/tweets");
        }else{
            if(foundUser){
                foundUser.tweets = Gottweets;
                foundUser.save(()=>{
                    res.redirect("/");
                })
            }
            
        }
        
    })
     */
    


});

app.post("/regsiter",bodyParser.urlencoded({extended: true}), (req, res)=>{
    console.log(req.body.email);
    Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
        if(err){
            console.log(err);
            res.redirect("/regsiter");
        }else{
            if(user){
                passport.authenticate("local")(req, res, function(){
                    res.redirect("/regsiter");
                })
            }
        }
    })
});
<%- include('partials/header') %>
<form action="/regsiter" method="post" class="login">
    <label for="emial" class="email">
        Email
        <input type="email" name="email" id="email">
    </label>
    <label for="password">
        Password
        <input type="password" name="password" id="password">
    </label>
    <div class="soicalLogin">
        <a href="#" class="facebook">Facebook</a>
        <a href="#" class="google">Google</a>

    </div>
    
    <button type="submit">Register</button>
    

</form>

<%- include('partials/footer') %>


Solution

  • You can try rewriting your POST /register endpoint with this example

    app.post("/register",bodyParser.urlencoded({extended: true}), (req, res, next) => {
        console.log(req.body.email);
        Tweet.register({username: req.body.email}, req.body.password, (err, user)=>{
            if(err){
                console.log(err);
                res.redirect("/regsiter");
                return;
            }
            if(!user){ // also handle the case where user is undefined
                return res.status(500).json({ yourMessage: 'error' });
            }
            next();
        })
    }, passport.authenticate("local", { successRedirect: '/', failureRedirect: '/register' }));
    

    It's not a good idea to override the next function given to passport.authenticate("local")

    Now the error should be gone, let me know if this code sample doesn't work.

    Hope it helps