护照 – 无法读取属性“isAuthenticated”

我正试图解决以下错误:

/home/ubuntu/workspace/src/util/utils.js:2 if (req.isAuthenticated()) { ^ TypeError: Cannot read property 'isAuthenticated' of undefined at Object.isLogged (/home/ubuntu/workspace/src/util/utils.js:2:11) at Object.<anonymous> (/home/ubuntu/workspace/src/routes/index.js:6:23) 

我在我的应用程序中使用以下护照:

 require('dotenv').config() const express = require('express') //... const session = require('express-session') const passport = require('passport') // configure passport require('./config/passport')(passport) const auth = require('./routes/auth') const index = require('./routes/index') const app = express() // ... app.use( session({ secret: 'super-mega-hyper-secret', resave: false, saveUninitialized: true, }) ) app.use(passport.initialize()) app.use(passport.session()) app.use((req, res, next) => { res.locals.currentUser = req.user next() }) // routes app.use('/', auth) app.use('/', index) app.listen(port, host, () => { console.log(`Listening on ${host}:${port}`) }) module.exports = app 

我的passport.js文件如下所示:

 const passport = require('passport') const LocalStrategy = require('passport-local').Strategy const service = require('../service/auth') module.exports = () => { passport-serialize-deserialize passport.serializeUser((user, done) => { done(null, user.id) }) passport.deserializeUser(async function(id, done) { const user = await service.findById(id) done(null, user) }) passport.use('local', new LocalStrategy({ usernameField: 'username', }, async(username, password, done) => { const user = await service.signin(username, password) done(null, user) })) } 

当我/被调用时,我正在使用isLogged()函数来控制是否需要login:

 const express = require('express') const router = express.Router() const utils = require('../util/utils') router.get('/', utils.isLogged(), (req, res) => { res.render('dashboard') }) module.exports = router 

函数的定义可以在我的utils.js文件中find,上面的错误日志指向:

 function isLogged(req, res, next) { if (req.isAuthenticated()) { next() } else { res.redirect('/') } } module.exports = { isLogged, } 

完整的代码stream程可以在下面的repo中find: 护照示例

有什么build议我做错了?`

我很感激你的回复!

当你运行这个代码时:

 router.get('/', utils.isLogged(), (req, res) => { res.render('dashboard') }); 

会发生什么是utils.isLogged()正在执行,这个执行的结果被注册为一个中间件。
既然你试图执行它没有任何parameter passing, res通过未定义,你得到你的错误。

现在,你真正想要做的就是传递函数本身,而不是执行,所以当express被调用的时候(在请求处理过程中),它会传递参数给它。 所以你的代码应该是这样的:

 router.get('/', utils.isLogged, (req, res) => { res.render('dashboard') });