Пытаюсь понять, зачем лишние скобки в конце звонка

Возможно, глупый вопрос, я пытаюсь проработать пример для 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);, который следует сразу после аутентификации.

Ценим любую помощь или ссылку на теорию/документацию по этому синтаксису.

(req, res, next) => {...} — это функция, в которой (req, res, next) автоматически вызывает функцию с этими параметрами. Это называется Функция самовызова
Get Off My Lawn 29.05.2019 22:46

Возможный дубликат Какова цель самовыполняющейся функции в javascript?

Get Off My Lawn 29.05.2019 22:46

@GetOffMyLawn Я понимаю синтаксис (()=>)(), но это метод object.method(params)(params). это то же самое?

Bibberty 29.05.2019 22:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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('/');
});

Итак, аутентификация похожа на синтаксис Promise, и мы ее вызываем?

Bibberty 29.05.2019 22:50

отличается от обещания, это называется закрытием developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

Rami Jarrar 29.05.2019 22:51

Спасибо, самое странное, что фактическая документация показывает, что он используется как прямой вызов. Но демонстрация использует приведенный выше синтаксис и все еще работает.

Bibberty 29.05.2019 22:54

Это связано с тем, что в документации он передается как экспресс-обработчик маршрута, поэтому экспресс-модуль будет выполнять этот дополнительный шаг/вызов внутри при поступлении запроса.

Rami Jarrar 29.05.2019 22:56

Да, именно этого я и ожидал от Рами. Так вы думаете, что автор демонстрации просто сделал ошибку, вызвав его?

Bibberty 30.05.2019 01:54

Нет, это не ошибка, все будет работать нормально, но это лишнее, проверьте мое обновление

Rami Jarrar 30.05.2019 02:01

Спасибо, я предпочитаю упрощенный. Я полностью понимаю, что все они вызываются Express. Был просто смущен тем, как он используется в этом случае. Спасибо за помощь.

Bibberty 30.05.2019 02:04

Я думаю, что это просто вопрос понимания синтаксиса Javascript для того, что называется «лямбда-функцией». Рассмотрим следующее выражение:

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

Это способ написания функции, которая принимает один аргумент и выводит его. Вы можете поместить это выражение в любое место, где вам нужно указать функцию, которая выводит один аргумент. Это полезно, потому что в Javascript функции могут передаваться точно так же, как и данные, и этот синтаксис позволяет вам определить функцию именно тогда, когда она вам нужна, не беспокоясь о том, чтобы дать ей имя.

В вашем примере вы вызываете app.get с тремя аргументами. Первая — это строка '/login'. Вторая — это функция, которая принимает 3 аргумента, и эта функция определена прямо в строке для вызова паспорта.authenticate, который возвращает функцию, которая вызывается с этими 3 аргументами. Третья — функция, принимающая 2 аргумента, тоже определенная тут же в строке.

Другие вопросы по теме