Vue3+Vite中关于websocket的配置和使用

问题起源

项目中原websocket地址如下:

js 复制代码
const currentUrl = window.location.host
const wsurl = `ws://${currentUrl}/api/alarm/page

其中是通过window.location.host来实现部署到不同的服务器上时的ip和port,比如:ws://10.11.15.38:8030/api/alarm/page

项目中原vite.config.js文件的配置如下:

js 复制代码
proxy: {
    '/api': {
      target: 'http://10.11.15.38:8030',
      changeOrigin: true,
      ws: true,
    },
 },

此时一旦连接websocket,就有可能报错4077或者4079,报错信息贴在下方:

但是!部署到生产环境后,生产环境是可以正常工作的,能与websocket建立长连接并返回对应的数据信息。 问了gpt,它说:

那么ok,已知了这个只对本地开发服务器有影响,那大概率就是配置问题了。因此,考虑更改配置:

解决方案

先修改websocket路径,在路径/api后添加/websockets:

js 复制代码
const currentUrl = window.location.host
const wsurl = `ws://${currentUrl}/api/websockets/alarm/page

再修改vite配置,添加/api/websockets的匹配项:

js 复制代码
proxy: {
    '/api/websockets': {
      target: 'ws://10.11.15.38:8030',
      ws: true,
      rewrite: (p) => p.replace(/^\/api\/websockets/, '/api'),
    },
    '/api': {
      target: 'http://10.11.15.38:8030',
      changeOrigin: true,
      ws: true,
    },
 },

此处需要注意:

1、ws的target最好设置成跟下方/apitarget一样,否则可能会连接不上ws服务器,也容易因为数据不一致导致歧义;

2、ws本来的地址是不包含/websockets的,所以匹配上之后要rewrite一下,将路径中的/websockets去掉;

3、/api/websockets要写在/api的前面,否则会被/api拦截,直接匹配到/api中去了,导致匹配不到;

4、最后,需要后端处理一下,将/api/websockets对应的地址指向原来/api对应的ws服务器上(此处具体我也不晓得,后端童鞋应该比较懂)。

以上,记录一下。

相关推荐
米尔的可达鸭21 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
还是大剑师兰特2 天前
Vite6 + Vue3 + TS 完整版标准配置模板
vite·大剑师·vite6配置
Linsk3 天前
前端开发:如何优雅引入polyfill
webpack·vite·rollup.js
永久鳕4 天前
WebSocket 连接成功但行情不更新,应该先查哪几个状态?
网络·websocket·网络协议
JerrySir5 天前
Node.js WebSocket 优雅关闭:一次滚动发布如何避免 1 万次重连风暴
websocket
CryptoPP5 天前
BSE股票K线数据接入实战:从接口调用到前端图表展示
大数据·前端·网络·人工智能·websocket·网络协议
宠友信息5 天前
多端即时通讯源码技术实践,Redis路由、MySQL持久化与Socket接入
spring boot·websocket·mysql·uni-app
脉动数据行情5 天前
Python WebSocket 实时订阅 NQ(小型纳斯达克指数)完整监听程序
websocket·小纳指·纳斯达克·国际股指·python 量化盯盘
console.log('npc')5 天前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
sdghterhd5 天前
WebSocket 快速入门教程(附示例源码)
网络·websocket·网络协议