Обрабатывать POST-запрос сразу от нескольких маршрутов - PullRequest
0 голосов
/ 19 ноября 2018

Я отправляю простую контактную форму в нижнем колонтитуле моего сайта (в footer.pug):

form(method="POST" action="contact_form")
  input(type='email' name='ct_email' data-name='ct_email' required)
  textarea(type='text' name='ct_message' data-name='ct_message' required)
  button(type='submit') Send

Поскольку форма находится в шаблоне, а шаблон нижнего колонтитула используется на всем сайте, форму можно отправлять различными способами:

  • /contact_form
  • /route1/contact_form
  • /route1/de/contact_form
  • и так далее ...

Так что теперь, похоже, мне нужно создать обработчик для всех возможных маршрутов:

router.post('/contact_form', function(req, res, next) {
  // ...
}

router.post('/route1/contact_form', function(req, res, next) {
  // ...
}

Как я могу легко обрабатывать POST-запросы от всех маршрутов, из которых они могут приходить без написания обработчика для каждого ?

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

Вот еще одно потенциальное решение - использовать независимую функцию в качестве обработчика маршрута.

router.post('/a', handlePost);
router.post('/b', handlePost);
router.post('/c', handlePost);

function handlePost(req, res, next){
  // use req.path here to figure out what url was called 

}
0 голосов
/ 19 ноября 2018

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

Попробуйте это

form(method="POST" action="/contact_form")

Обратите внимание на действиеизменено с contact_form на /contact_form.Когда вы добавляете /, вы начинаете ссылаться на путь как на абсолютный путь к домену.Так что теперь со всех страниц форма будет отправлена ​​на http://your-domain/contact-form.

0 голосов
/ 19 ноября 2018

Не совсем уверен, что это именно то, что вы имеете в виду, но первый аргумент маршрутизатору ExpressJS (я предполагаю, что именно здесь router делает) может быть массивом.Поэтому вместо:

router.post('/contact_form', function(req, res, next) {
    // ...
}

router.post('/route1/contact_form', function(req, res, next) {
    // ...
}

Вы можете просто сделать:

router.post(['/contact_form','route1/contact_form'],function(req,res,next){
    //some fancy logic to handle both routes.
})

Конечно, для этого необходимо сохранить список этих возможных маршрутов.С другой стороны, вы можете следовать совету Динеша Пандийяна и просто использовать абсолютный путь.Таким образом, вместо page1.html, page2.html, page3.html и т. Д., Каждый из которых имеет свой собственный маршрутизатор (или собственную запись в массиве маршрутизаторов), вы, по сути, будете говорить «Перейти к маршруту домена, а затем перейти к этомуадрес».

0 голосов
/ 19 ноября 2018

Каждый запрос должен обрабатываться в отдельных функциях, поскольку каждый запрос имеет свою логику. Однако, если вы хотите

function request(req, res, next) {
// Your logic
}

router.post('/contact_form', request) {
  // ...
}

router.post('/route1/contact_form', request) {
  // ...
}

Сейчас у меня нет способа проверить этот код, но я думаю, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...