[英]Passport - Cannot read property '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()
函數來控制是否需要登錄:
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
文件中找到,上面的錯誤日志指向:
function isLogged(req, res, next) {
if (req.isAuthenticated()) {
next()
} else {
res.redirect('/')
}
}
module.exports = {
isLogged,
}
完整的代碼流可以在以下 repo 中找到: passport example
有什么建議我做錯了嗎?`
我感謝您的回復!
當您運行此代碼時:
router.get('/', utils.isLogged(), (req, res) => {
res.render('dashboard')
});
發生的情況是utils.isLogged()
正在執行,此執行的結果被注冊為中間件。
由於您嘗試在不傳遞任何參數的情況下執行它,因此res
被傳遞為 undefined 並且您會收到錯誤消息。
現在,你真正想做的是傳遞函數本身,而不是它的執行,所以當 express 調用它時(在請求處理期間),它會將參數傳遞給它。 所以你的代碼應該是這樣的:
router.get('/', utils.isLogged, (req, res) => {
res.render('dashboard')
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.