我正在尝试使用nodejs、express、ejs、passportjs、express-session等创建一个网站。它是一个普通的网站,但我正在尝试提供管理面板以在网站上添加动态内容。我已经给出了管理面板的路线。但当我尝试获取 /admin 路径或任何与 admin 相关的路径时,我收到此错误: TypeError: req.isAuthenticated is not a function。有人知道如何解决吗?下面是我的代码:
app.js:
const express = require('express')
const ejsLayouts = require('express-ejs-layouts');
const cors = require('cors');
const webRoutes = require('./routes/webRoutes')
const userRoutes = require('./routes/userRoutes')
const app = express()
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(__dirname + '/public'));
app.use(cors());
app.set('view engine', 'ejs');
app.use(ejsLayouts);
// Middleware to set currentPage variable
app.use(function(req, res, next) {
res.locals.currentPage = req.path;
next();
});
app.use("/", webRoutes);
app.use("/admin", userRoutes);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log('listening on port 3000');
});
passport-config.js:
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')
function initialize(passport, getUserByEmail, getUserById) {
const authenticateUser = async (email, password, done) => {
const user = getUserByEmail(email)
if (user == null) {
return done(null, false, { message: 'No user with that email' })
}
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user)
} else {
return done(null, false, { message: 'Password incorrect' })
}
} catch (e) {
return done(e)
}
}
passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser((id, done) => {
return done(null, getUserById(id))
})
}
module.exports = initialize
userRoutes.js:
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config()
}
const express = require('express');
const app = express();
const router = express.Router();
const bcrypt = require('bcrypt');
const passport = require('passport');
const flash = require('express-flash');
const session = require('express-session');
const methodOverride = require('method-override');
const initializePassport = require('../passport-config')
initializePassport(
passport,
email => users.find(user => user.email === email),
id => users.find(user => user.id === id)
)
const users = []
app.use(flash())
app.use(session({
secret: process.env.SECRET_KEY,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.use(methodOverride('_method'))
// Middleware to set layout for all admin routes
router.use((req, res, next) => {
res.locals.layout = 'layout_admin'; // Specify the admin layout
next();
});
router.get('/', checkAuthenticated, (req, res) => {
res.render('./admin/admin_home', {name: req.body.name});
});
router.get('/login', checkNotAutenticated, (req, res) => {
res.render('./admin/admin_login');
});
router.post('/login', checkNotAutenticated, passport.authenticate('local', {
successRedirect: '/',
failureRedirect: 'login',
failureFlash: true
}) )
router.get('/register', checkNotAutenticated, (req, res) => {
res.render('./admin/admin_register');
});
router.post('/register', checkNotAutenticated, async (req, res) => {
try {
const hashedPass = await bcrypt.hash(req.body.password, 10)
users.push({
id: Date.now().toString(),
name: req.body.name,
email: req.body.email,
password: hashedPass
})
res.redirect('login')
} catch (err) {
res.redirect('register')
}
console.log(users)
});
router.delete('/logout', (req, res) => {
req.logOut()
res.redirect('login')
})
function checkAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next()
}
res.redirect('login')
}
function checkNotAutenticated(req, res, next) {
if (req.isAuthenticated()) {
return res.redirect('/')
}
next()
}
module.exports = router;
在
userRoutes
中,您同时使用应用程序和路由器,并且护照是在应用程序中加载的,而不是在路由器中加载的,因此路由器没有加载护照中间件,因此出现未定义的错误。
因此,在
userRoutes
中,只需使用 router
而不是 app
,并在其中加载中间件:
const express = require('express');
const router = express.Router();
//...
router.use(flash())
router.use(session({
secret: process.env.SECRET_KEY,
resave: false,
saveUninitialized: false
}))
router.use(passport.initialize())
router.use(passport.session())
router.use(methodOverride('_method'))
//...