我有一个使用 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.13
Docker
(在Mac
上)后可能会看到错误,重新启动Docker
解决了问题。该应用程序也运行Node.js
/React
,但不运行Django
。基本上,我在连接到与身份验证/从云数据库中获取任何内容相关的MongoDB Atlas
时遇到了问题。
选择本地主机的确切值来填充"目标"属性主要是解决方案(它可以是本地主机,127.0.0.1,[::1])。
mac用户应输入终端以获取解决方案:
sudo lsof -iTCP -sTCP:LISTEN -n -P
正确答案是使用手动代理
- 目标 = 码头工人地址
django:4000
- 正确的主机标头
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"