簡體   English   中英

護照 - 無法讀取屬性“isAuthenticated”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM