React Proxy 错误:无法将请求 /api/ 从 localhost:3000 代理到 http://local



我有一个使用 jwt 向 Django 后端进行身份验证的 React 前端。 后端工作正常,并且使用 django 视图连接得很好,但是当我尝试代理来自 React 的请求时,它给了我一个连接被拒绝错误。

代理错误:无法将/api/auth/token/获取/从本地主机:3000 代理请求到 http://localhost:8000 (ECONNREFUSED)。

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

在我的package.json中,我有:

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

编辑:公共存储库。 如果您安装了 docker,则可以轻松运行。(使用 1 个映像和 2 个容器)。 克隆后只需运行docker-compose build,然后docker-compose up

编辑2:请求的标头:

*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

所以问题在于,由于 Node 开发环境和 Django 开发环境都在单独的 docker 容器中运行,所以localhost指的是节点容器,而不是桥接网络。

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

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

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

我遇到了类似的问题,但在 Mac 机器中。我在package.json中将localhost更改为127.0.0.1,这对我有用,如下所示:

"proxy": "http://127.0.0.1:5000"

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

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

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

编辑--

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

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

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

我更新了:

"proxy": "http://localhost:8000"

自:

"proxy": "http://127.0.0.1:8000"

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

如果您不想设置 docker compose,也可以使用docker 网络

创建网络并在该网络中运行 Docker 容器

docker network create webapp_network
docker run -d -p 5000:5000 --name webapp_backend --network webapp_network webapp_backend_image
docker run -d -p 3000:3000 --name webapp_frontend --network webapp_network webapp_frontend_image

在我的前端 React webapp 的 package.json 中添加了一行:

"proxy": "http://webapp_backend:5000"

注意 现在可以使用容器名称而不是本地主机来引用后端

如果您使用的是较新版本的CRA 2.0+,则需要通过手动代理执行此操作。 https://facebook.github.io/create-react-app/docs/proxying-api-requests-in-development#configuring-the-proxy-manually

昨天升级到版本v19.03.13Docker(在Mac上)后可能会看到错误,重新启动Docker解决了问题。该应用程序也运行Node.js/React,但不运行Django。基本上,我在连接到与身份验证/从云数据库中获取任何内容相关的MongoDB Atlas时遇到了问题。

选择本地主机的确切值来填充"目标"属性主要是解决方案(它可以是本地主机,127.0.0.1,[::1])。

mac用户应输入终端以获取解决方案:

sudo lsof -iTCP -sTCP:LISTEN -n -P

正确答案是使用手动代理

  1. 目标 = 码头工人地址django:4000
  2. 正确的主机标头localhost:8000

因为如果 Django 使用返回绝对 urlreverse函数

reverse('preview-mail', args=[mail.pk],request=request)

您需要为其提供正确的 HOST 标头,否则您可能会得到这样的结果 URL https://django:4000/your-url'

const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
proxy('/api', {
target: 'http://django:4000',
changeOrigin: true,
secure: false,
pathRewrite: {
'^/api': ''
},
onProxyReq: function (proxyReq, req, res) {
proxyReq.setHeader("host", 'localhost:8000')
}
})
)
}

如果您正在处理 MERN 堆栈应用程序,请确保您不在客户端文件夹中。你需要在根。在根目录中,在终端中运行此命令。 npm 运行开始:开发

对于 NodeJs 后端,这可以通过在后端的 package.json 文件中添加一行代码来解决

"devstart": "nodemon server.js --ignore './location of frontend react directory'",

当我更改网络服务器地址时,我遇到了这个问题。 起初我有一个本地主机,一切都很好。为了让我从其他机器访问我的 Web 服务器,我将其地址更改为 0.0.0.0,之后我遇到了这个问题。它帮助我将代理设置从本地主机更改为 127.0.0.1

就我而言,我的服务器在端口3001上运行,但我在 React 前端项目的 😆 package.json 文件中"proxy": "http://localhost:3000"

相关内容

最新更新