护照问题:无法读取未定义的属性(读取 isAuthenticated())

发布于 2025-01-09 15:34:53 字数 3208 浏览 2 评论 0原文

我读过其他具有类似标题的问题,但没有一个解决方案适合我。我相信我需要的答案可能根本不同。我试图在登录主页的用户已经登录时重定向他们。这是我的登录路线:

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;

这是我的 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);
});

我尝试切换我的顺序中间件,并使用 if(req.session.passport.user !== undefined) 无济于事。如果您需要更多背景信息,请告诉我。谢谢你!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文