护照问题:无法读取未定义的属性(读取 isAuthenticated())
我读过其他具有类似标题的问题,但没有一个解决方案适合我。我相信我需要的答案可能根本不同。我试图在登录主页的用户已经登录时重定向他们。这是我的登录路线:
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论