Как НЕ отправить ответ на пост-вызов ajax в node.js? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть пост-вызов ajax, и я хочу просто отправить значения формы, не дожидаясь ответа.Я хочу перенаправить из моего экспресс-приложения, а не с клиентской стороны.на стороне сервера:

router.post("/", (req, res)=>{ 
     res.status(200).send(`signup/confirm-email?v=${req.body.email}`);
     // i want to be able to rediect with res.redirect("signup/confirm-email?v=${req.body.email}")
     }; 
});

на стороне клиента:

    $.post('/signup', $('#signup-form-container form').serialize())
 .done(lnk=>{
       window.location.replace(`${window.location}${lnk}`); })
 .fail(function(xhr){ //handle errors };

Приведенный выше код работает, он отправляет ответ ajax, а затем я перенаправляю со стороны клиента.Я хочу перенаправить со стороны сервера.Я попытался перенаправить из моего экспресс-приложения с помощью res.redirect (), но он не работает без регистрации ошибок на консоли и на вкладке сети в инструменте dev, он показывает, что тип запроса - xhr.Если нет решения этой проблемы, то есть ли способ скрыть запрос в полученном маршруте.Я не хочу, чтобы v=${req.body.email} отображалось в строке URL.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Суть Ajax в том, что запрос выполняется JavaScript, а ответ обрабатывается JavaScript.

Если вы вернете ответ о перенаправлении, JavaScript будет следовать за перенаправлением, сделать новый запрос и обработать ответ на него.

Если вы не хотите обрабатывать ответ с помощью JavaScript: Не используйте Ajax . Вместо этого используйте отправку обычной формы.

0 голосов
/ 11 мая 2019

Избегайте использования jQuery, это почти всегда приведет к плохим практикам и не поддерживаемому коду.

Вам следует использовать простой Javascript или React, если вам нужна инфраструктура (в основном, если вам нужно работать над большим проектом), но может не подходить для начинающих JS).Мое решение здесь в простом Javascript.

В качестве замены утилиты запроса jQuery ($.post() и т. Д.), Браузеры имеют очень хороший API-интерфейс HTTP-запроса с именем fetch (MDN) .Я использую его в этом решении.

Если вы не хотите показывать параметр email в URL, вы можете установить его в localStorage.

Вы не можете перенаправить напрямуюот Экспресс для POST метода.Только если вы пытаетесь GET страницы, Express может перенаправить на другой GET (и, таким образом, изменить URL в вашем браузере).

Единственное решение, которое вам нужно - это использовать window.locationпосле получения ответа от вашей /signup конечной точки.

на стороне сервера:

router.post('/', function (req, res) {
  const form = req.body.form
  // your registration code here
  // ...
  res.json({
    success: true,
    email: form.email
  })
})

на стороне клиента: signup.js

const form = {
  email: document.getElementById('email').value
  // add other fields you need
}

fetch('/signup', {
  method: 'POST',
  headers: {
    'Content-type': 'application/json'
  },
  body: JSON.stringify({ form })
})
  .then(res => res.json())
  .then(res => {
    // Set the localStorage item so you can get it back
    // in the JS script of /signup/confirm-email
    localStorage.setItem('email', res.email)

    // Redirect to the confirm email page
    window.location = '/signup/confirm-email'
  })

на стороне клиента:confirmEmail.js

const email = localStorage.getItem('email')
if (!email) window.location = '/signup'

// proceed with your code

Код этого ответа

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