我正在阅读一篇有关使用护照本地猫鼬进行身份验证的文章。 Article
在本文中,我找到了这行代码,它们确实注册了用户并将其登录
app.post('/register', function(req, res) {
Account.register(new Account({ username : req.body.username }), req.body.password, function(err, account) {
if (err) {
return res.render('register', { account : account });
}
passport.authenticate('local')(req, res, function () {
res.redirect('/');
});
});
});
让我困惑的部分是这个
passport.authenticate('local')(req, res, function () {
res.redirect('/');
});
首先,我不理解passport.authenticate()
之后的部分。它看起来不像回调或IIFE。
第二,据我所知,passport.authenticate()
是一种中间件(对不起,如果我错了)。我们应该把它用作那样的功能吗?
对此我最好的解释是,因为在上面的文章中已定义
passport.use(new LocalStrategy(Account.authenticate()))
因此,passport.authenticate()
现在将调用Account.authenticate()
。奇怪的是,authenticate()
需要输入密码,而我们没有提供密码。也许它返回了Promise,但是我上面所说的部分看起来并不像Promise。
那部分是什么,实际上是登录用户的好习惯吗?
答案 0 :(得分:1)
首先让我们谈论这个怪异的部分:
TLDR::正如第一个评论者所述, passport.authenticate返回一个函数 。
我们如何调用函数?像这样:functionName(param1, param2, callbackMaybe);
。您认为这样做没问题吗?
现在,看看下面的代码
function a() {
return function b() {
console.log("Hi there!");
}
}
函数a
返回函数b
。您将如何在控制台中使用Hi there!
?您必须这样做a()()
。
您可以通过以下方式进行操作:
let b = a(); // Since, a returns a function so, b is now a function.
b();
与此处相同,passport.authenticate('local')
返回一个带有3个参数的函数,其中最后一个是回调函数。在表达方面,第三个参数是next()
函数。我相信您知道next()
函数的用法。您正在发送function () { res.redirect('/'); }
作为回调。该回调函数将您重定向到此'/'
路由。
问题的第二部分
现在,注册后我看不到任何网站自动登录用户。
希望有帮助。