I have read other questions with similar titles and none of the solutions work for me. I believe the answer I require is probably fundamentally different. I am trying to redirect users that are logged in to the home page when they go to the login since they are already logged in. This is my route for login:
const express = require('express');
const passport = require('passport')
const passportLocal = require('passport-local')
const router = express.Router();
router.get('/', isLoggedIn, (req, res) => {
res.render('login')
})
router.post('/', passport.authenticate("local", {
successRedirect: "/",
failiureRedirect: "/login?error=true"
}));
function isLoggedIn(req, res, next) {
try {
if (req.isAuthenticated()) return next();
res.redirect('/')
} catch(err){
res.render('login', { errorMessage : err })
console.log(`Application has encounted an error\n${err}`)
}
}
module.exports = router;
This is my app.js:
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const passportLocal = require('passport-local')
const bodyParser = require('body-parser')
const bcrypt = require('bcrypt');
const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args));
const dotenv = require('dotenv').config();
const mongoose = require('mongoose');
var app = express();
mongoose.connect(process.env.DATABASE_URL, { useNewURLParser: true, useUnifiedTopology: true });
var db = mongoose.connection;
db.on("error", console.error.bind(console, "Connection Error:"));
db.once("open", function () {
console.log("Connected to database");
});
var User = require("./models/user.model");
app.use(express.static(__dirname + "/public", {
index: false,
immutable: true,
cacheControl: true
}));
app.use(express.urlencoded({ extended: false }))
var indexRoute = require('./routes/index.routes');
var loginRoute = require('./routes/login.routes');
var registerRoute = require('./routes/register.routes');
app.use("/", indexRoute)
app.use("/login", loginRoute)
app.use("/register", registerRoute)
app.set('view engine', 'ejs');
var PORT = process.env.PORT || 3000;
app.use(session({
resave: false,
saveUninitialized: true,
secret: process.env.SESSION_SECRET,
cookie: {
maxAge: 86400000
}
}));
app.use(bodyParser.urlencoded({ extended: false }))
app.use(passport.initialize());
app.use(passport.session());
passport.use(new passportLocal((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) { return done(err); }
if (!user) { return done(null, false); }
bcrypt.compare(password, user.password, (err, res) => {
if (err) { return done(err); }
if (res === false) { return done(null, false, { message: 'Incorrect password.' }); }
return done(null, user);
});
});
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
})
});
app.listen(PORT, process.env.IP, function () {
console.log("server is listening on port " + PORT);
});
I have tried switching around the order of my middleware, and using if(req.session.passport.user !== undefined) to no avail. Let me know if you need more context. Thank you!