Search code examples
node.jssessionexpress-session

Check if the user is logged in or not using session and node.js


I'm pretty new to node.js and express-session. I'm trying to implement a login/registration system. If the user is logged in, I will allow give access to them to view some pages like scoreboard, else (the user is not logged in or registered) I want to redirect him/her to the login/registration page.

Here is my code:

router.post('/login', (req, res) => {
    var email = req.body.email;
    var password = req.body.password;
    userModel.authenticate(email, password, (err, user) => {
        if (err) {
            console.log(err)
        }
        else if (!user) {
            console.log('Wrong Password')
        }
        else {
            req.session.userId = user._id;
            console.log(req.session.userId);
            res.redirect('/user/scoreboard')
        }
    })
});

router.post('/register', (req, res) => {
    var newUser = {
        teamName: req.body.teamName,
        faculty: req.body.faculty,
        email: req.body.email,
        password: req.body.password
    }
    userModel.create(newUser, (err, user) => {
        if (err) {
            console.log('[Registratoin]: ' + err);
        } else {
            req.session.userId = user._id;
            console.log('[Registration]: Done');
            // req.session.userID = user._id;
            res.redirect('user/scoreboard')
        }
    });
});

router.get('/scoreboard',async (req, res) => {
    console.log(req.session.userId)
    if (req.session.userId) {
        const teams = await userModel.find({}).sort('-score')
        const faculties = await userModel.aggregate([{
            "$group": {
                _id: "$faculty",
                average: {
                    $avg: "$score"
                }
            }
        }]).sort("-average")
        res.render('main/scoreboard', {
            teamInformation: teams,
            finalResult: faculties
        })
    }
    else {
        res.redirect('/')
    }


});

And here is my front-end functions:

function registration() {
        $.post('/user/register', {
            teamName: $('#teamName').val(),
            faculty: $('#faculty').val(),
            email: $('#emailSignUp').val(),
            password: $('#passwordSignUp').val()
        }).done(
            history.pushState(null, null, "user/scoreboard")
        )
    }
    function login() {
        $.post('/user/login', {
            email: $('#emailSignIn').val(),
            password: $('#passwordSignIn').val()
        }).done(() => {
            history.pushState(null, null, "user/scoreboard")
        })
    }

Whenever I register a new user the page is just reloaded!

enter image description here

Unfortunately, I don't know where the problem is (from the server side or front-end implementation). How can I debug it?


Solution

  • It seems because of you use submit button your page automatically reloaded.

    I recommend you to change the input type to button and add then follow below instructions:

    <input type="button" value="ورود" onclick="login()"/>
    
    function login() {
            $.post('/user/login', {
                email: $('#emailSignIn').val(),
                password: $('#passwordSignIn').val()
            }).done(() => {
                window.location.assign('/user/scoreboard')
            })
    }