理解 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) {
...
}
}
req、res 和 next 由快递提供给 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)就传递给了上面这行代码。
这是否解决了您的问题?
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) {
...
}
}
req、res 和 next 由快递提供给 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)就传递给了上面这行代码。
这是否解决了您的问题?