React - ошибка сети при отправке запроса POST только при использовании HTTPS. - PullRequest
0 голосов
/ 25 мая 2018

У меня есть веб-приложение, в котором интерфейсная часть выполняется с помощью React (create-реагировать-приложение) и развернута на Heroku.Бэкэнд делается с помощью node.js / express и работает на Amazon EC2.У меня нет проблем с тем, чтобы приложение работало при развертывании внешнего интерфейса на локальном хосте или в Heroku, если я получаю доступ к нему через HTTP как http://myapp.heroku.com. Проблема возникает, когда я обращаюсь к нему по HTTPS (который являетсяпо умолчанию в Heroku) как https://myapp.heroku.com. Когда я делаю это и отправляю запрос на сервер node.js на Amazon EC2, я получаю следующую ошибку:

Error: Network Error
Stack trace:
createError@https://myapp.herokuapp.com/static/js/bundle.js:1555:15
handleError@https://myapp.herokuapp.com/static/js/bundle.js:1091:14

Вот часть ввнешний интерфейс, который отправляет запрос на сервер node.js:

_deflateAscii(valueAscii){
axios.post('//My-EC2-Instance-Here.compute.amazonaws.com:80/deflate/ascii', {inflatedAscii: valueAscii}).then(res => {
  this.setState(
    {
      inflatedAscii: valueAscii,
      inflatedHex: res.data.inflatedHex,
      deflatedBase64: res.data.deflatedBase64,
      deflatedHex: res.data.deflatedHex
    },
    this._setTextBoxesValues
  );
}).catch((err) => {
   console.log(err)});
  }

Вот модули, которые я использую на стороне сервера:

const express = require('express');
const cors = require('cors');
const http = require('http');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cors());

И обработка деталей идетзапрос от внешнего интерфейса:

app.post('/deflate/ascii', function(req, res){
try{
  console.log('request received');
  var inflatedHexValue = convert.asciiToHex(req.body.inflatedAscii);
  var deflatedBase64Value = deflate.asciiToBase64(req.body.inflatedAscii);
  var deflatedHexValue = deflate.asciiToHex(req.body.inflatedAscii);
}catch(err){
  console.log(err);
  res.status(500).send(err);
}
response = {
  deflatedBase64: deflatedBase64Value,
  deflatedHex: deflatedHexValue,
  inflatedHex: inflatedHexValue
};
res.end(JSON.stringify(response));
console.log('response sent');
});

Когда я получаю Сетевую ошибку на внешнем интерфейсе, сервер node.js не получает запрос, но я провел некоторую диагностику с Wireshark, и естьи рукопожатие с сервером EC2, но трафик там заканчивается без HTTP-трафика:

TCP-трафик между https://myapp.heroku.com/ и My-EC2-Instance-Here.compute.amazonaws.com

Нужен ли SSL на бэкэнде, если интерфейстакое HTTPS?Из этого поста я понял, что он также может обойтись без Нужен ли нам ssl-сертификат для внешнего интерфейса и внутреннего интерфейса? .В любом случае, это всего лишь курсовой проект, и туда и обратно ходят только бессмысленные строки.

1 Ответ

0 голосов
/ 24 марта 2019

Когда вы посещаете свой сайт через https в браузере, вам необходимо отключить блокировку смешанного контента (http и https).В результате ваш браузер классифицирует соединение как незащищенное.Так что да, было бы хорошо использовать SSL / TSL как для внутреннего, так и для внешнего интерфейса.

Алос, вы пытались использовать

res.json(response);
res.status(200).end();

или установить заголовки в application / json?Я рекомендую помещать ваши вызовы res в блок try catch, потому что ваш res.end будет выполнен в любом случае.

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