试图了解为什么通话结束时会有多余的括号

时间:2019-05-29 20:42:42

标签: javascript node.js express syntax passport.js

可能是一个愚蠢的问题,我正在尝试为OAuth编写一个示例,并希望在添加到自己的代码之前准确了解正在发生的事情。

样本是nodeexpress使用passport-azure-ad

正在定义路由,并调用了passport.authenticate

app.get('/login',
  (req, res, next) => {
      passport.authenticate('azuread-openidconnect', 
      { 
        response: res,
        resourceURL: config.resourceURL,
        failureRedirect: '/' 
      })(req, res, next); // <-- Here is what I am stuck on. 
   },
   (req, res) => {
       log.info('Login was called in the Sample');
       res.redirect('/');
});

我正在尝试理解认证之后的(req, res, next);

感谢任何帮助,或有关此语法的理论/文档的链接。

2 个答案:

答案 0 :(得分:2)

那是因为passport.authenticate返回了一个函数(中间件)来处理请求,因此您要将请求传递给此处的实际处理程序

像这样:

function authenticate(someArg) {
    return function (req, res, next) {
        // the handler
    }
}

这是您提供的示例的简化版本,没有额外的参数显式传递

app.get('/login', passport.authenticate('azuread-openidconnect', { 
    response: res,
    resourceURL: config.resourceURL,
    failureRedirect: '/' 
}), (req, res) => {
    log.info('Login was called in the Sample');
    res.redirect('/');
});

答案 1 :(得分:0)

我认为这只是理解所谓的“ lambda”函数的Javascript语法的问题。考虑以下表达式:

(a) => { console.log(a) }

这是一种编写带有一个参数并将其输出的函数的方法。您可以将该表达式放在需要指定一个输出一个参数的函数的任何位置。这很有用,因为在Javascript中,函数可以像数据一样传递,并且此语法允许您在需要时立即定义函数,而不必为它命名。

在您的示例中,您要使用三个参数调用app.get。第一个是字符串“ / login”。第二个是带有3个参数的函数,该函数在该行中直接定义,以调用passport.authenticate,它返回一个函数,该函数被这3个参数调用。第三个是带有2个参数的函数,该参数也在该行中直接定义。