我无法理解Passport.js的自定义回调是怎么回事。我不明白最后的(req, res, next)
。我们应该从封闭中得到这些值吗?
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 :(得分: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
构造函数中添加更多逻辑。
答案 1 :(得分:0)
是(req,res,next)将这些值从路由器上下文传递到passport.authenticate函数中。如果我是你,我也会考虑你的路由器的中间件(快递?) - 它是一种简单的方法来添加身份验证到您的路由而不是你在这里做的细粒度方式(将不得不将passport.auth添加到每个路由你想验证)。