我试图创建一个网站使用NodeJS,Express,ejs,passportjs,Express-Session等,这是一个正常的网站,但我试图给管理面板,以增加网站上的动态内容.我已经给出了管理面板的路由.但是,当我try 获取/admin路径或任何与admin相关的路径时,我得到了这个错误:TypeError:req.isAuthenticated不是一个函数.有人知道怎么解决这个问题吗?以下是我的代码:

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

帖子主题:Re:Колибри

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中,你同时使用应用程序和路由,而Passport被加载到应用程序中,而不是路由中,所以路由没有加载Passport中间件,因此出现错误,因为它是未定义的.

因此,在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'))

//...

路由文档:express.Router

Node.js相关问答推荐

在导入时未找到Pupeteer-PAGE-Proxy包

如何在Mongoose中调用动态Collection ?

如何在mongodb集合中设置数据限制?

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

如何在Node.js的telegraf.js命令中添加参数?

为什么 nginx 不将我的 react index.html 作为后备服务

我如何保护nodejs中的路由

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

node.js 变量不存在代码块

我们如何或可以通过 npm 和 Meteor 使用 node 模块?

如何将使用 Gulp 的 node 部署到 heroku

如何以编程方式检测nodejs中的调试模式?

如何在 MongoDB 上只收听 localhost

通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器

Node.js 应用程序有周期性的缓慢和/或超时(不接受传入的请求)

在单独的模块中定义 Mongoose 模型

需要 node-gyp 的 npm install 在 Windows 上失败

Meteor - collection.find() 总是返回所有字段

nodemon + express,监听端口=?

NodeJS:如何调试检测到 EventEmitter 内存泄漏.添加了 11 个侦听器