使用 react-scripts 代理 websocket 不起作用
Proxying websocket with react-scripts does not work
我有一个反应网络应用程序,我使用反应脚本进行开发。我使用代理将请求和 websockets 代理到后端。
我的 package.json :
{
"name": "webapp",
"version": "0.1.0",
"private": true,
"dependencies": {
// ...
"react-scripts": "^3.3.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
// ...
},
"devDependencies": {
// ...
},
"homepage": "/home"
}
我有一个 setupProxy.js :
const proxy = require("http-proxy-middleware")
module.exports = app => {
app.use(proxy('/api', {
target: 'http://127.0.0.1:9140',
ws: true
}));
app.disable('etag');
}
代理可以很好地处理 http 请求。 React Web 应用程序在 http://localhost:3000/api/foo/bar
上执行请求并且请求在 http://localhost:9140/api/foo/bar
.
上被代理
我的问题是 websockets。 React web 应用程序在 ws://localhost:3000/api/foo/bar
上打开一个 websocket,后端接收 websocket 请求并升级它,并以 101 http 代码响应。但是 React Web 应用程序永远不会收到此响应。 React Web 应用程序收到 400 http 代码响应。所以websocket关闭了。
我试图找出 React 应用程序收到 400 错误的原因。我尝试了很多代理配置(我尝试了 package.json
文件中的代理配置,我尝试了一些基于 http-proxy-middleware
github 页面的其他可能的配置)。
我发现 http-proxy-middleware
和 react-scripts
存在一些问题:
- https://github.com/facebook/create-react-app/issues/5280
- https://github.com/chimurai/http-proxy-middleware/issues/112
经过一些调查,问题似乎来自 Webpack 使用的 sockjs-node
。看起来 sockjs-node
捕获请求并将我的后端响应替换为错误 400 响应。
有谁知道如何让 websockets 在开发中的反应应用程序中使用代理?
在 create-react-app v3.3.0 中,websocket 代理是 broken。尝试降级到 v3.2.0。我仍然使用 v3.3.0 beta 版本,因为我依赖于无效合并,但我通常不建议使用 beta 版本。
我有一个反应网络应用程序,我使用反应脚本进行开发。我使用代理将请求和 websockets 代理到后端。
我的 package.json :
{
"name": "webapp",
"version": "0.1.0",
"private": true,
"dependencies": {
// ...
"react-scripts": "^3.3.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
// ...
},
"devDependencies": {
// ...
},
"homepage": "/home"
}
我有一个 setupProxy.js :
const proxy = require("http-proxy-middleware")
module.exports = app => {
app.use(proxy('/api', {
target: 'http://127.0.0.1:9140',
ws: true
}));
app.disable('etag');
}
代理可以很好地处理 http 请求。 React Web 应用程序在 http://localhost:3000/api/foo/bar
上执行请求并且请求在 http://localhost:9140/api/foo/bar
.
我的问题是 websockets。 React web 应用程序在 ws://localhost:3000/api/foo/bar
上打开一个 websocket,后端接收 websocket 请求并升级它,并以 101 http 代码响应。但是 React Web 应用程序永远不会收到此响应。 React Web 应用程序收到 400 http 代码响应。所以websocket关闭了。
我试图找出 React 应用程序收到 400 错误的原因。我尝试了很多代理配置(我尝试了 package.json
文件中的代理配置,我尝试了一些基于 http-proxy-middleware
github 页面的其他可能的配置)。
我发现 http-proxy-middleware
和 react-scripts
存在一些问题:
- https://github.com/facebook/create-react-app/issues/5280
- https://github.com/chimurai/http-proxy-middleware/issues/112
经过一些调查,问题似乎来自 Webpack 使用的 sockjs-node
。看起来 sockjs-node
捕获请求并将我的后端响应替换为错误 400 响应。
有谁知道如何让 websockets 在开发中的反应应用程序中使用代理?
在 create-react-app v3.3.0 中,websocket 代理是 broken。尝试降级到 v3.2.0。我仍然使用 v3.3.0 beta 版本,因为我依赖于无效合并,但我通常不建议使用 beta 版本。