2017-11-01 16 views
2

私は次のエラーを修正しようとしています:パスポート - プロパティを読み取ることができません「に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) 
    })) 
} 

ログインが必要な場合は、コントロールする10機能:

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

module.exports = { 
    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ファイル、で見つけることができます以下のレポで見つけること:passport example

任意の提案は、私が間違っているの何 `

私はあなたの回答に感謝!

+1

関数に 'req'、' res'と 'next'を渡さないので、パラメータなしで' utils.isLogged() 'を呼び出します。したがって、 'req'とその他は未定義です。 – cramopy

+3

'router.get'行の' isLogged'の最後から '()'を削除します。 –

+1

@Kirk私はこの提案を実際にあなたと同期して書いていました:)私はあなたよりも長い時間をとりました - 最初は – cramopy

答えて

1

あなたはこのコードを実行すると:何が起こることはutils.isLogged()が実行されていることである

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

を、この実行の結果がミドルウェアとして登録されています。
パラメータを渡さずに実行しようとすると、resが未定義として渡され、エラーが発生します。

実際に実行したいのは、実行自体ではなく関数自体を渡すことです。したがって、expressが(要求処理中に)それを呼び出すと、その関数にパラメータが渡されます。したがって、あなたのコードは次のようになります:

router.get('/', utils.isLogged, (req, res) => { 
    res.render('dashboard') 
}); 
関連する問題