Search code examples
javascriptexpressloggingmiddleware

Express login middleware doesn't work as intended


I'm a web begginer so don't expect too much.

I have a sign in page that save the email entered as cookie, and an account page that deletes it when a log out button is pressed.

I'm trying to do a middleware that will redirect the user to sign in if the cookie it's deleted - the user logs out.

When the cookie is configured, everithing works as intended, but if i press the log out button, the sign in page won't render.

For the sign in route I have this script:

const fs = require('fs');
const path = require('path');
const { v4 } = require('uuid');
const express = require("express");
const cookieParser = require('cookie-parser'); 

const { containsObject, getUsers } = require('../Auth/auth.cjs');
const {userExists} = require('./signin.cjs')

const router = express.Router();

router.get('/', (req, res) => {

    const {cookies} = req;

    if(cookies['email']){
        res.redirect('/main');
    }
    else{
        res.render('SignIn/signin');
    }
})

router.post('/', async (req, res) => {

    const user = {
        email:req.body.email,
        password:req.body.password,
    }
        
    const result = await userExists(user);

    if(result){
        res.cookie('email', req.body.email);
        res.redirect('/main');
    }
    else{
        res.render('SignIn/signin', user)
    }

})

module.exports = router;

The logout button is an form! - I could't came up with anything else easier.

  <form method="post">
            <input type="submit" value="Log out"/>
  </form>

Log out route:

const fs = require('fs');
const path = require('path');
const { v4 } = require('uuid');
const express = require('express');
const { route } = require('../SignIn/signin');
const { compile } = require('ejs');

const {getUser, getPostsFromUser} = require('./account.cjs')

const router = express.Router();

router.get("/", async (req, res) => {
    const {cookies} = req;
    const email = cookies['email'];
    const userResponse = await getUser(email);

    const user = {
        username:userResponse['username'],
        email:userResponse['email'],
    }

    console.log(await getPostsFromUser(user));

    res.render('Account/account', user);
})

router.post('/', (req, res) => {
    
    // const {cookies} = req;
    res.cookie('email', '', {expires: new Date(0)});
    res.clearCookie("email");
    res.redirect('/sign')
})

module.exports = router;

And the main file:

const { localsName } = require("ejs");
const express = require("express");
const app = express();
const cookieParser = require('cookie-parser');

const users = []
let loggedIn = false

app.set('view engine', 'ejs');

app.use(cookieParser());
app.use(express.static('public'));
app.use(express.urlencoded({extended:true}))

app.use((req, res, next) => {
    const {cookies} = req;
    console.log(cookies['email'])

    if(cookies['email'] == undefined){
        return res.redirect('/sign');
    }
    else{

        next();
    }
})

app.get('/', (req, res) =>{
    res.redirect('/sign')
})

const signRouter = require('./views/SignIn/signin.js');
app.use('/sign', signRouter);

const authRouter = require('./views/Auth/auth.js');
app.use('/auth', authRouter);

const mainRouter = require('./views/Main/main.js');
app.use('/main', mainRouter);

const addPostRouter = require('./views/Add_post/add_post.js');
app.use('/add-post', addPostRouter);

const accountRouter = require('./views/Account/account.js');
app.use('/account', accountRouter);

app.listen(3000)

I have tried multiple ways to do so, but I can't figure out why it can't simply render the page.


Solution

  • The problem is that I put the middleware just above the signin route so it will caused a circular redirect, because without being signed in you will first be redirected to signin router from where it will try to render.

    The solution is to just move the middleware under the signin route in server.js file. So the file will look like this:

    
    app.get('/', (req, res) =>{
        res.redirect('/sign')
    })
    
    const signRouter = require('./views/SignIn/signin.js');
    app.use('/sign', signRouter);
    
    app.use((req, res, next) => {
        const {cookies} = req;
        console.log(cookies['email'])
    
        if(cookies['email'] == undefined){
            return res.redirect('/sign');
        }
        else{
    
            next();
        }
    })
    
    const authRouter = require('./views/Auth/auth.js');
    app.use('/auth', authRouter);
    
    // other routes