首页 文章

React Proxy错误:无法将请求/ api /从localhost:3000代理到http:// localhost:8000(ECONNREFUSED)

提问于
浏览
9

我有一个React前端,它使用jwt来验证Django后端 . 后端工作,并使用django视图连接正常,但当我尝试代理来自React的请求时,它给了我一个连接拒绝错误 .

代理错误:无法将请求/ api / auth / token / gain /从localhost:3000代理到http:// localhost:8000(ECONNREFUSED) .

连接到http://localhost:8000/api/auth/token/obtain/正常工作 . 并且使用Axios发送POST请求也能正常工作并返回令牌json . 但是当我用节点代理它时,它不起作用 .

在我 package.json 我有:

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

编辑:Public repo . 如果安装了docker,则可以轻松运行 . (使用1个图像和2个容器) . 克隆后只需运行 docker-compose build ,然后 docker-compose up .

Edit2:请求 Headers :

*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

2 回答

  • 7

    所以问题是因为Node dev环境和Django dev环境都在不同的docker容器中运行,所以 localhost 指的是节点容器,而不是桥接网络 .

    所以关键是使用容器链接,这些链接在使用 docker-compose 时自动创建,并将其用作主机名 . 所以我改成了

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

    只要您使用相同的 docker-compose 命令启动两个容器,这样就可以了,否则您必须在 docker-compose.yml 文件中手动指定external_links .

  • 2

    我也遇到了同样的问题 . 大多数搜索结果都提到将 "secure": false"ignorePath": true 添加到您的代理配置中 . 像这样的东西:

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

    可能值得一试,但不幸的是,这对我没有用 . 虽然每个地址(http://localhost:3000http://localhost:8000)在浏览器中都可以正常工作,但是由于容器实际上是代理的,它需要使用Docker地址吗?

    EDIT--

    好吧,我想我弄明白了 . 我认为它确实与集装箱到集装箱通信有关 . 查看 docker-compose ,您的api服务器名为 django . 将package.json文件更改为:

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

相关问题