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

ccl*_*oyd 12 django node.js reactjs axios

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

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

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

在我的package.json身上:

  "proxy": {
    "/api/*":  {
      "target": "http://localhost:8000"
    }
  },
Run Code Online (Sandbox Code Playgroud)

编辑: 公共回购.如果安装了docker,则可以轻松运行.(使用1个图像和2个容器).克隆docker-compose build后再运行,然后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
Run Code Online (Sandbox Code Playgroud)

小智 29

我遇到了类似的问题,但是是在 Mac 机器上。我在package.jsonlocalhost中进行了更改,这对我有用,如下所示:127.0.0.1

"proxy": "http://127.0.0.1:5000"
Run Code Online (Sandbox Code Playgroud)

  • 这在 Flask 项目中对我有用。谢谢你!!!!!!!! (3认同)
  • 尝试过这个,但不起作用。React 仍在尝试向 localhost:3000 发送请求 (2认同)

ccl*_*oyd 10

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

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

"proxy": {
    "/api":  {
        "target": "http://django:8000"
    }
},
Run Code Online (Sandbox Code Playgroud)

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

  • 我遇到了同样的问题,对我来说,当 package.json 中的代理是一个对象时,我收到了一个错误,因此它必须是一个字符串,但是 `http://<container-name>:<port>` 效果很好!多谢 (2认同)

小智 10

实际上并没有在这里得到我正在寻找的答案,但有一个适合我的替代解决方案。我认为它与 Node v17 特别相关,因为那是我开始发生这种情况的时候,但解决方案非常简单。

我更新了:

"proxy": "http://localhost:8000"
Run Code Online (Sandbox Code Playgroud)

到:

"proxy": "http://127.0.0.1:8000"
Run Code Online (Sandbox Code Playgroud)

如果它是相关的(我认为不是)-我正在代理到 Django 服务器。


Vin*_*tJr 6

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

"proxy": {
    "/api/*":  {
      "target": "http://localhost:8000",
      "secure": false
    }
  },
Run Code Online (Sandbox Code Playgroud)

可能值得一试,但是不幸的是,这些都不适合我。尽管每个地址(http:// localhost:3000http:// localhost:8000)在浏览器中都可以正常工作,但也许由于容器实际上是代理服务器,因此它需要使用Docker地址吗?

编辑 -

好吧,我想我明白了。我相信这确实与容器到容器的通信有关。在您docker-compose看来,您的api服务器称为django。将您的package.json文件更改为此:

"proxy": {
    "/api/*":  {
      "target": "http://django:8000",
      "secure": false
    }
  }
Run Code Online (Sandbox Code Playgroud)