websocket - 如何在反应应用程序中使用 http-proxy-middleware 正确设置 websocket 代理
问题描述
我使用 create-react-app 创建了一个 react 应用程序,并尝试使用 http-proxy-middleware 设置 websocket 代理。
这里是配置。
const { createProxyMiddleware } = require('http-proxy-middleware');
let remote_url = 'http://127.0.0.1:8088/';
module.exports = function (app) {
app.use(
'/name',
createProxyMiddleware({
target: remote_url,
changeOrigin: false,
ws: true,
secure: false,
//logLevel: 'debug',
pathRewrite: {
'^/name': '/name',
},
}),
);
app.use(
'/api',
createProxyMiddleware({
target: remote_url,
changeOrigin: false,
ws: false,
pathRewrite: {
'^/api': '/api',
},
}),
);
}
这是我放入浏览器控制台进行测试的测试脚本
// Create WebSocket connection.
const socket = new WebSocket('ws://127.0.0.1:3000/name');
// Connection opened
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
当 web-dev-server 启动时,它会打印以下日志
[HPM] Proxy created: / -> http://127.0.0.1:8088/
[HPM] Proxy rewrite rule created: "^/name" ~> "/name"
[HPM] Proxy created: / -> http://127.0.0.1:8088/
[HPM] Proxy rewrite rule created: "^/api" ~> "/api"
/api 上的 http 代理工作正常。但是, /name 上的 ws 代理似乎无法正常工作,并且连接会挂起一段时间,直到失败。前端项目使用 CRA 的 web-dev-server 启动,api 由 spring-boot 项目提供。
如果我将前端项目构建到后端 spring-boot 项目中,并让 spring-boot 项目托管所有这些静态文件。在这种情况下,websocket 可以连接,并且测试脚本工作正常。
解决方案
推荐阅读
- angular - 如何将 formControl 与 mat-stepper 和 ngFor 一起使用
- objective-c - 将 @import 声明与 ASTMatchers 匹配
- vb.net - 模糊导入 Microsoft.Office.Interop.Word 和 DataTable
- python - 读取格式化的行以填充数组
- html - 我的投资组合的响应能力问题
- salesforce - Salesforce 公式逻辑
- ios - 如何在 Swift 中将 UITextField 中的数据用作数组?
- blockchain - Electrum 服务器方法:“blockchain.scripthash.subscribe”
- bash - 如何打印代理并将其添加到服务器?
- bash - 带有时间戳的批处理间隔屏幕截图