2016-09-26 64 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函數中。如果我是你,我也會考慮你的路由器的中間件(express?) - 這是一種向你的路由添加認證的簡單方法,而不是你在這裏做的細粒度方式(必須將passport.auth添加到每條路由你想認證)。