如何解决“TypeError: req.isAuthenticated is not a function”错误?

问题描述 投票:0回答:1

我正在尝试使用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;
node.js passport.js ejs express-session
1个回答
0
投票

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'))

//...
© www.soinside.com 2019 - 2024. All rights reserved.