web-dev-qa-db-fra.com

Réaction du proxy: impossible de demander le proxy/api/de localhost: 3000 à http: // localhost: 8000 (ECONNREFUSED)

J'ai une interface React qui utilise jwt pour s'authentifier auprès du serveur Django. Le backend fonctionne et se connecte très bien avec des vues Django, mais lorsque j'essaie de transmettre une requête à React par proxy, une erreur de connexion refusée m'est générée.

Erreur de proxy: impossible de demander par proxy/api/auth/token/obtenir/de localhost: 3000 à http: // localhost: 8000 (ECONNREFUSED).

La connexion à http: // localhost: 8000/api/auth/token/obtenir/ fonctionne normalement. Et envoyer une demande POST avec Axios fonctionne également normalement et renvoie le jeton json. Mais quand je le proxy avec noeud, cela ne fonctionne pas.

Dans mon package.json j'ai:

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

Edit: Repo publique . Vous pouvez exécuter facilement si vous avez installé Docker. (utilise 1 image et 2 conteneurs). Après le clonage, exécutez simplement docker-compose build, puis docker-compose up.

Edit2: En-têtes de la requête:

*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
9
cclloyd

Le problème venait donc du fait que l’environnement de développement de nœud et l’environnement de développement de Django s’exécutaient dans des conteneurs de menu fixe distincts. localhost faisait donc référence au conteneur de noeud, pas au réseau ponté. 

La clé consistait donc à utiliser des liens de conteneur, créés automatiquement lors de l'utilisation de docker-compose, et à les utiliser comme nom d'hôte. Alors je l'ai changé pour 

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

Et cela a fonctionné, tant que vous lancez les deux conteneurs avec la même commande docker-compose, sinon vous devez spécifier manuellement external_links dans votre fichier docker-compose.yml.

7
cclloyd

Je rencontre aussi le même problème. La plupart des résultats de recherche mentionnent l'ajout de "secure": false ou "ignorePath": true à votre configuration de proxy. Quelque chose comme ça:

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

Ça vaut peut-être la peine d'essayer mais malheureusement, rien de tout cela n'a fonctionné pour moi. Bien que chaque adresse ( http: // localhost: 3000 et http: // localhost: 8000 ) fonctionne parfaitement dans le navigateur, peut-être puisque le conteneur effectue-t-il actuellement une proxy qui nécessite-t-il une adresse Docker?

MODIFIER--

D'accord, je pense l'avoir compris. Je crois que cela avait à voir avec la communication conteneur à conteneur. En regardant dans votre docker-compose, votre serveur d'api s'appelle Django. Changez votre fichier package.json en ceci:

"proxy": {
    "/api/*":  {
      "target": "http://Django:8000",
      "secure": false
    }
  }
3
VincentJr