«ERR_HTTP_HEADERS_SENT» после запроса POST в приложении Node.js / Express с клиентом http запроса - PullRequest
1 голос
/ 09 февраля 2020

Строка res.send("Successfully saved the new address."); выдает ошибку 'ERR_HTTP_HEADERS_SENT'.

Я прочитал другие посты, касающиеся той же ошибки, и попробовал return res.send("Successfully saved the new address."), но это не исправило. Есть идеи?

Примечание: Я новичок в этом.

Пожалуйста, будьте добры.

Спасибо.

Мой код

app.post("/", function(req, res) {
  const url = "http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates?";
  const street = req.body.street;
  const city = req.body.city;
  const state = req.body.state;
  const zip = req.body.zip;

  const yourAddress = "Address=" + street.replace(" ", "+") + "&City=" + city.replace(" ", "+") + "&Zip=" + zip;
  const parameters = "&category=&outFields=*&forStorage=false&f=json";

  request(url + yourAddress + parameters, function(error, response, body) {
    const data = JSON.parse(body);

    const newAddress = data.candidates[0].address;
    const longitude = data.candidates[0].location.x;
    const latitude = data.candidates[0].location.y;

    const address = new Address({
      address: newAddress,
      latitude: latitude,
      longitude: longitude
    });

    address.save(function(err) {
      if (!err) {
        res.send("Successfully saved the new address.");
      } else {
        res.send(err);
      }
    });
  });
  res.redirect("/");
});

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вы делаете res.send() и res.redirect() в одном и том же обработчике запросов. Вы не можете отправить два ответа на один и тот же запрос. Вот что генерирует предупреждающее сообщение, которое вы видите.

Выберите одно из другого. Вы либо хотите отправить соответствующий статус о .save(), либо хотите перенаправить. Один или другой, а не оба.

В этом конкретном коде сначала происходит res.redirect(), так что это то, что видит клиент. Затем, после этого и после того, как request() и address.save() завершены, вы пытаетесь res.send(), но это блокируется, потому что ответ уже отправлен и соединение http уже установлено.

Если вы просто хотите перенаправить при успешном сохранении, вы можете удалить существующий res.redirect() и изменить его на:

address.save(function(err) {
  if (!err) {
    res.redirect("/");
  } else {
    console.log(err);
    res.sendStatus(500);
  }
0 голосов
/ 09 февраля 2020

Я бы согласился с ответом @ jfriend00, поскольку на запрос может быть только один ответ. Вот что вы можете сделать:

address.save(function(err) {
  if (!err) {
    res.redirect('/success')
  } else {
    res.send(err);
  }
});
//add a new route
     app.get('/success',(req,res)=>{res.send('Successfully saved the new address.')})

И затем вы можете перенаправить на домашнюю страницу.

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

Другой способ - перенаправление на стороне клиента, например: если вы используете jquery

 $.ajax({
      statusCode: {
        200: function() {
         $(location).attr('href', 'to the homepage')
        }
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...