理解 passport.authenticate('local') 语法位

Understanding passport.authenticate('local') syntax bit

tl;dr: 我想弄清楚代码末尾的 (req, res) 位。

我很难理解一段涉及使用本地策略的“passport.authenticate()”的代码。

我有以下(有效)路线:

router.post("/login", function (req, res, next) {
  passport.authenticate('local', { session: false }, function (err, user, info)  {
    if (err || !user) {
      return res.status(400).send({
        message: "Something went wrong",
        user: user
      })
    }

      return res.send({user, info})
  }) (req, res) // What´s this??
})

据我所知,路由调用 passport.authenticate(),然后调用我在另一个文件中设置的本地策略,后者又 returns 错误,用户,信息。执行回调后,此代码处理可能的错误,如果一切正常,它会沿着本地策略中设置的消息发回用户...

最后一点没看懂。 (req, res) 到底在做什么?我知道这是一个关键点,因为没有那条线路由将无法工作,但我不明白为什么,也不明白它到底是什么(它是在调用带有参数 req 和 res 的函数吗?它是否返回 req 和 res?) ,因为我不认识这个模式(它确实类似于 IIFE,但我又不知道它到底在调用什么,因为 passport.authenticate() 本身就是一个函数调用......或者不是?

它将参数传递给将被 returned 的函数。

请查看源代码以了解更多信息,看看发生了什么。

passport/lib/middleware/authenticate.js

@Dijkie85,原谅我最近比较忙

考虑:

function getFoo(arg1, arg2) {
  return function getFoo(arg3, arg4) {
    return (arg3 + arg4) || "foo";
  }
}
console.log(getFoo()); // "Function: getFoo"
console.log(getFoo()()); // "foo"
console.log(getFoo()(1, 2)); // 3

在 authenticate.js 文件中你也处于同样的情况。您可以为简单起见删除逻辑并再次检查:

module.exports = function authenticate(passport, name, options, callback) {
  return function authenticate(req, res, next) {
    ...
  }
}

reqresnext 由快递提供给 return功能。

首先,请看下面的示例代码:

//outerFunction returns a function (namely innerFunction) instead of just a value/object
function outerFunction() {
  var x = 5;
  function innerFunction(x) {
    return x * 2;
  }
  return innerFunction;
}

//calling only outerFunction by using outerFunction()
var result1 = outerFunction();
console.log('Result on invoking only outer function: \n'+result1); 
//returns innerFunction() method NOT any value/object

//invoking innerFunction() by using outerFunction()(10) and passing 10 as argument to innerFunction
var result2 = outerFunction()(10);
console.log('Result is '+result2); 
//returns 20

//invoking innerFunction() by using outerFunction()() and not passing any argument to innerFunction
var result3 = outerFunction()();
console.log('Result is '+result3); 
//returns NaN because no value was passed to the innerFunction's parameter x`

将此代码与您的代码进行比较: passport.authenticate('local',anonyFunction)(req, res);

因此,passport 有一个名为 authenticate 的外部函数,它 return 是一个接受 2 个参数的内部函数:req 和 res。

查看 https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js

中 passport.authenticate 的源代码

第 94 行:return 函数 authenticate(req, res, next)

那么,你的谜题(req, res)就传递给了上面这行代码。

这是否解决了您的问题?