2016-09-26 7 views
0

Passport.jsのカスタムコールバックで何が起こっているのか理解できません。私は最後に(req, res, next)を理解していません。閉鎖によるこれらの価値を持っているべきですか?Passportjsコールバック、引数を理解する

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); //<=== What is the purpose of this? 
}); 
+0

これは自己呼び出し機能です。これは、req、res、およびnextをparamsとして渡しています。 https://jsfiddle.net/ccestd3o/ – yBrodsky

答えて

1

passport.authenticate()は、middlewareです。簡単に言えば、ミドルウェアとは、要求を変更して次の要求ハンドラに渡す関数です。 expressの要求ハンドラは引数として(req, res, next)をとる関数です。 passport.authenticateは、がミドルウェアを返す関数であり、これは引数として(req, res, next)をとります。

一般的に、それはこのように使用されます。

app.get('/login', passport.authenticate()); 

せるpassport.authenticate()は、次のハンドラに沿って、それを渡し、ユーザーが認証されていることを確認し、要求を変更します。この場合

は、我々は passport.authenticateはもう少しやりたいので、私たちは代わる:同等と

app.get('/login', passport.authenticate()); 

app.get('/login', function (req, res, next) { 
    passport.authenticate()(req, res, next) 
}); 

、その後、より多くのロジックがpassport.authenticateコンストラクタに追加されます。

+0

ああ、それは理にかなっています。通常、ミドルウェアとして使用されるときは、req、res、nextの引数で呼び出されます。この例では通常のミドルウェアとして使用していないため、これらの値を自分自身に渡す必要があります。 – Elliot

0

はい(req、res、next)は、これらの値をルーターコンテキストからpassport.authenticate関数に渡します。もし私があなただったら私はあなたのルータのミドルウェアを調べるでしょう(明示?) - あなたがここでそれをやっている細かい方法ではなく、あなたのルートに認証を加える簡単な方法です(passport.authをすべてのルートあなたは認証したいと思っていました)。

関連する問題