Возможно, глупый вопрос, я пытаюсь проработать пример для OAuth
и хочу точно понять, что происходит, прежде чем добавлять в свой собственный код.
Образец node
, express
с использованием 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);
, который следует сразу после аутентификации.
Ценим любую помощь или ссылку на теорию/документацию по этому синтаксису.
Возможный дубликат Какова цель самовыполняющейся функции в javascript?
@GetOffMyLawn Я понимаю синтаксис (()=>)()
, но это метод object.method(params)(params)
. это то же самое?
Это потому, что 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('/');
});
Итак, аутентификация похожа на синтаксис Promise
, и мы ее вызываем?
отличается от обещания, это называется закрытием developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
Спасибо, самое странное, что фактическая документация показывает, что он используется как прямой вызов. Но демонстрация использует приведенный выше синтаксис и все еще работает.
Это связано с тем, что в документации он передается как экспресс-обработчик маршрута, поэтому экспресс-модуль будет выполнять этот дополнительный шаг/вызов внутри при поступлении запроса.
Да, именно этого я и ожидал от Рами. Так вы думаете, что автор демонстрации просто сделал ошибку, вызвав его?
Нет, это не ошибка, все будет работать нормально, но это лишнее, проверьте мое обновление
Спасибо, я предпочитаю упрощенный. Я полностью понимаю, что все они вызываются Express. Был просто смущен тем, как он используется в этом случае. Спасибо за помощь.
Я думаю, что это просто вопрос понимания синтаксиса Javascript для того, что называется «лямбда-функцией». Рассмотрим следующее выражение:
(a) => { console.info(a) }
Это способ написания функции, которая принимает один аргумент и выводит его. Вы можете поместить это выражение в любое место, где вам нужно указать функцию, которая выводит один аргумент. Это полезно, потому что в Javascript функции могут передаваться точно так же, как и данные, и этот синтаксис позволяет вам определить функцию именно тогда, когда она вам нужна, не беспокоясь о том, чтобы дать ей имя.
В вашем примере вы вызываете app.get с тремя аргументами. Первая — это строка '/login'. Вторая — это функция, которая принимает 3 аргумента, и эта функция определена прямо в строке для вызова паспорта.authenticate, который возвращает функцию, которая вызывается с этими 3 аргументами. Третья — функция, принимающая 2 аргумента, тоже определенная тут же в строке.
(req, res, next) => {...}
— это функция, в которой(req, res, next)
автоматически вызывает функцию с этими параметрами. Это называется Функция самовызова