Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 试图理解为什么在通话结束时会有额外的括号_Javascript_Node.js_Express_Syntax_Passport.js - Fatal编程技术网

Javascript 试图理解为什么在通话结束时会有额外的括号

Javascript 试图理解为什么在通话结束时会有额外的括号,javascript,node.js,express,syntax,passport.js,Javascript,Node.js,Express,Syntax,Passport.js,这可能是一个愚蠢的问题,我正在尝试通过一个示例来演示OAuth,希望在添加到自己的代码之前,能够准确地了解发生了什么 示例是节点,快速使用passport azure ad 正在定义路由并调用passport.authenticate app.get('/login', (req, res, next) => { passport.authenticate('azuread-openidconnect', { response: res,

这可能是一个愚蠢的问题,我正在尝试通过一个示例来演示
OAuth
,希望在添加到自己的代码之前,能够准确地了解发生了什么

示例是
节点
快速
使用
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('/');
});
app.get(“/login”,
(请求、恢复、下一步)=>{
passport.authenticate('azuread-openidconnect',
{ 
答复:res,
resourceURL:config.resourceURL,
failureRedirect:“/”
})(请求、回复、下一步);//{
info('在示例中调用了Login');
res.redirect('/');
});
我试图理解认证后直接出现的
(req,res,next);


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

这是因为
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('/');
});

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

(a) => { console.log(a) }
这是一种编写接受一个参数并将其输出的函数的方法。您可以将该表达式放在任何需要指定输出一个参数的函数的地方。这很有用,因为在Javascript中,函数可以像数据一样传递,并且此语法允许您在需要时正确定义函数,而无需b我想给它起个名字


在您的示例中,您使用三个参数调用app.get。第一个是字符串“/login”。第二个是一个接受三个参数的函数,该函数在第二行中定义,用于调用passport.authenticate,该函数返回一个使用这三个参数调用的函数。第三个是一个接受两个参数的函数就在这一行中定义。

(req,res,next)=>{…}
是函数,
(req,res,next)
是它用这些参数自动调用函数的地方。这被称为@GetOffMyLawn的可能副本我理解
(()=>)的语法,但这是一个方法
对象(params)(params)
。这是一样的吗?好吧,那么身份验证类似于
承诺
语法,我们称之为它?它不同于承诺,这称为闭包谢谢,最奇怪的是实际文档显示它被用作直接调用。但是演示使用了上述语法并且仍然有效。这是因为在文档中它是作为快速路由处理程序传递,因此当请求传入时,快速模块将在内部执行此额外步骤/调用。是的,这正是我所期望的Rami。那么您认为演示作者只是在调用它时出错了吗?