React Proxy error: Не удалось прокси-запрос/api/с localhost: 3000 на http://localhost: 8000 (ECONNREFUSED)

У меня есть интерфейс React, который использует jwt для аутентификации с бэкэндом Django. Бэкэнд работает и прекрасно соединяется с использованием представлений django, но когда я пытаюсь проксировать запрос от React, он дает мне ошибку Connection Refused.

Ошибка прокси: не удалось прокси-запрос/api/auth/token/получить/с localhost: 3000 до http://localhost: 8000 (ECONNREFUSED).

Подключение к http://localhost: 8000/api/auth/token/get/ работает нормально. И отправка запроса POST с помощью Axios также работает нормально и возвращает токен json. Но когда я прокси-сервер с узлом, он не работает.

В моем package.json меня есть:

  "proxy": {
    "/api/*":  {
      "target": "http://localhost:8000"
    }
  },

Изменение: публичное репо. Вы можете легко запустить, если у вас установлен докер. (использует 1 изображение и 2 контейнера). После клонирования просто запускается docker-compose build docker-compose up, затем docker-compose up.

Edit2: Заголовки запроса:

*General*
Request URL: http://localhost:3000/api/auth/token/obtain/
Request Method: POST
Status Code: 500 Internal Server Error
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade

*Response Headers*
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Date: Mon, 30 Apr 2018 21:23:17 GMT
Connection: keep-alive
Transfer-Encoding: chunked

*Request Headers
POST /api/auth/token/obtain/ HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 45
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Content-Type: application/json
Accept: */*
Referer: http://localhost:3000/login
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fr;q=0.8,ja;q=0.7

Ответ 1

Таким образом, проблема заключалась в том, что как среда Node dev, так и среда Django dev выполнялись в отдельных контейнерах докеров, поэтому localhost ссылался на контейнер узла, а не на мостовую сеть.

Таким образом, ключ должен был использовать контейнерные ссылки, которые автоматически создаются при использовании docker-compose и используют это как имя хоста. Поэтому я изменил его на

"proxy": {
    "/api":  {
        "target": "http://django:8000"
    }
},

И это сработало, если вы запускаете оба контейнера с той же командой docker-compose, в противном случае вам нужно вручную указать docker-compose.yml файле docker-compose.yml.

Ответ 2

Я сталкиваюсь с той же проблемой. В большинстве результатов поиска упоминается добавление "secure": false или "ignorePath": true к вашей конфигурации прокси. Что-то вроде этого:

"proxy": {
    "/api/*":  {
      "target": "http://localhost:8000",
      "secure": false
    }
  },

Возможно, стоит попробовать, но, к сожалению, у меня ничего не вышло. Хотя каждый адрес (http://localhost: 3000 и http://localhost: 8000) работает в браузере совершенно нормально, возможно, поскольку контейнер на самом деле проксирует, ему нужно использовать адрес Docker?

EDIT--

Хорошо, я думаю, что я понял это. Я полагаю, что это имеет отношение к связи контейнера с контейнером. Глядя в ваш docker-compose, ваш сервер api называется django. Измените файл package.json следующим образом:

"proxy": {
    "/api/*":  {
      "target": "http://django:8000",
      "secure": false
    }
  }