用户注册后登录用户

时间:2019-12-02 12:16:25

标签: javascript node.js authentication passport.js passport-local

我正在阅读一篇有关使用护照本地猫鼬进行身份验证的文章。 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。

那部分是什么,实际上是登录用户的好习惯吗?

1 个答案:

答案 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('/'); }作为回调。该回调函数将您重定向到此'/'路由。

问题的第二部分

现在,注册后我看不到任何网站自动登录用户。

希望有帮助。