node.js/express: используйте router.route() с функциями промежуточного программного обеспечения.

Я хотел бы использовать метод route() на экспресс-маршрутизаторе для обслуживания определенного маршрута с помощью различных методов HTTP. Следующий код работает нормально:

var express = require('express');
var router  = express.Router();

router.route('/register')
  .get(adm.signUpForm)
  .post(adm.signUp);

Однако при попытке использовать промежуточное ПО на почтовом маршруте я застреваю. Работает следующий код:

// LOGIN processing
router.post('/login', passport.authenticate("local", {
  successRedirect: '/',
  failureRedirect: '/login'
}), function(){
  //empty
});

Здесь вызывается функция промежуточного программного обеспеченияpassport.authenticate(...), чтобы проверить, действительны ли учетные данные пользователя. Аутентифицированные пользователи перенаправляются на домашнюю страницу по адресу "/"; Неизвестные пользователи (или с неправильным паролем) перенаправляются обратно в форму «/login».

Теперь я хотел бы реорганизовать этот код и использовать что-то похожее на пример кода, показанный выше (маршрут регистрации), т.е. е. Я хотел бы использовать router.route('/login).xxxx для обслуживания HTTP-запроса xxxx на маршруте '/login'. Как я могу указать экспрессу использовать мою промежуточную функцию паспорта.

router.route('/login')
  .get(adm.loginForm)
  .post(<my-middleware-function ???>, adm.login);

... где adm.loginForm — это функция конечной точки, которая выдает форму входа по запросу GET к /login и adm.login. это функция конечной точки, которая должна вызываться, когда сервер получает запрос POST по этому маршруту, т.е. е. после отправки формы входа.

Насколько мне известно, в документации Express (4.x) ничего не говорится об установке промежуточной функции для определенного маршрута и (в то же время) конкретного HTTP-запроса. Я знаю, что router.route('/login').use() можно использовать для установки промежуточной функции для всех HTTP-запросов на этом маршруте, но я хочу только мое промежуточное ПО для вызова POST-запросов.

Какие-либо предложения? Спасибо.


person Frank    schedule 12.06.2019    source источник


Ответы (1)


Вы можете добавить их там, где вы упомянули:

router.route('/login').post(checkPassport, adm.login)

Вы также можете связать их вместе:

router.route('/login').post(checkPassport).post(adm.login)

checkPassport — это промежуточное программное обеспечение, которое вам нужно написать для обработки логики аутентификации паспорта.

person MattB    schedule 12.06.2019
comment
Привет Мэтт - спасибо за быстрый ответ. Вы правы, можно добавить функцию промежуточного программного обеспечения, как указано в вашем ответе. Я понимаю, что моя проблема заключается в другом: определение «checkPassport» как отдельной функции и использование ее в качестве функции промежуточного программного обеспечения, как показано в вашем примере, функциональность паспорта, похоже, не работает - браузер никогда не получает ответ на запрос POST на маршруте '/login' (= тайм-аут). Однако встраивание тела checkPassport в качестве первого параметра в метод .post устраняет проблему. Может быть, какая-то обязательная проблема? - person Frank; 14.06.2019
comment
Решил это - это действительно была проблема с тем, как паспорт. Аутентификация должна привыкнуть, когда она не используется в качестве встроенного промежуточного программного обеспечения. Относится к: stackoverflow.com/questions/21631451/. Ключевое предложение можно найти в документах «passport.js»: обратите внимание, что при использовании пользовательского обратного вызова ответственность за установление сеанса (вызовом req.login()) и отправку ответа ложится на приложение. - person Frank; 14.06.2019