How to initiate session on signup with cookie-session and passport.js?

573 Views Asked by At

I have a /register router for signing up a user. I am using cookie-session (which is similar) instead of express-session for simplicity for now.

I am stuck on the part where I need to authenticate a user on sign up. I am confused about the functionality of req.sessions.save() and req.login(). I know req.login() is provided by passport.js, but I don't understand which one provides the req.session object.

I am new to passport.js and have read numerous articles, videos, and StackOverflow questions extensively to build up my knowledge. Honestly, the passport documentation has been quite a pain so far. I am still confused about how session initiation on signup should work. Many articles skipped the signup part. I thus request help on how to do it.

router.post('/register', (req, res, next) => {
    console.log(req.body)
    User.findOne({email: req.body.email}).then((currentUser) => {
        if(currentUser){ // already exists
            res.render('login')
        } else { // if not, create user in our db
            new User({
                email: req.body.email
            }).save().then((newUser) => {
                passport.authenticate('local')(req, res, () => {
                    
//>>>>              //**This is where I don't know what to do**
                    
                    req.session.save((err) => {
                        if (err) {
                            return next(err)
                        }
                        res.redirect('http://localhost:3000')
                    })
                })
            });
        }
    });
})
2

There are 2 best solutions below

2
On
passport.authenticate('local')(request, response, () => {
  req.session.save((err) => {
    if (err) {
      return next(err)
    }
    res.redirect('http://localhost:3000')
  })
}
1
On

const express = require("express");
const router = express.Router();
const passport = require("passport");

router.post("/register", (req, res, next) => {
  User.findOne({ email: req.body.email }).then((currentUser) => {
    if (currentUser) { // already exists
      res.render('login')
    } else { // if not, create user in our db
      new User({
        email: req.body.email
      }).save();
    }
  });

  passport.authenticate("local", function (err, user, info) {
    if (err) {
      return res.status(400).json({ errors: err });
    }
    if (!user) {
      return res.status(400).json({errors:"No user found."});
      

      // or save User : new User({email: req.body.email}).save();
    }

    req.login(user, function (err) {
      if (err) {
        return res.status(400).json({ errors: err });
      }

      req.session.save((err) => {
        if (err) {
          return next(err)
        }
        res.redirect('http://localhost:3000')
      });      
      return res.status(400).json({ success: `logged in ${user.id}` });
    });
  })(req, res, next);
});

module.exports = router;