当前位置: 首页 > news >正文

vue3接收SSE流数据进行实时渲染日志

后端使用的是 Spring Boot WebFlux(响应式编程框架),并且返回的是 Server-Sent Events (SSE) 流式数据,那么在 Vue3 中,需要使用 EventSource API 或 fetch + 流式读取 来正确获取响应内容。

方案 1:使用 EventSource(推荐,兼容 SSE 标准)

如果你的后端返回的是标准的 SSE 数据流(Content-Type: text/event-stream),可以直接用浏览器原生的 EventSource 监听数据:

前端代码(Vue3 Composition API)

<script setup>
import { onMounted, onUnmounted, ref } from "vue";const logContent = ref('') // 存储日志内容
const logContainer = ref(null)
const error = ref(null)
let eventSource = null// 对后端返回的数据做换行
const formattedText = computed(() => {return logContent.value.replace(/#n/g, '\n')
})
// 封装连接 SSE 的逻辑
const connectToLogStream = () => {eventSource = new EventSource('/api/algWebflux/getLog')eventSource.onmessage = (event) => {// 新内容追加到已有内容下方,并转换 #n 为换行符logContent.value += event.data.replace(/#n/g, '\n') + '\n\n'// 自动滚动到底部scrollToBottom()eventSource.onerror = (err) => {console.error('SSE error:', err)// 5秒后自动重连setTimeout(connectSSE, 5000)}}eventSource.onerror = (err) => {error.value = '日志流连接失败'console.error('SSE Error:', err)}
}const scrollToBottom = () => {nextTick(() => {if (logContainer.value) { // 确保元素存在logContainer.value.scrollTop = logContainer.value.scrollHeight}})
}// 组件挂载时调用
onMounted(() => {connectToLogStream()
});// 组件卸载时关闭连接
onUnmounted(() => {if (eventSource) eventSource.close()
})
</script>

如果代码中调用接口写成这种方式报错跨域错误(如 No 'Access-Control-Allow-Origin' header

  eventSource = new EventSource('http://192.168.14.231:5400/algWebflux/getLog')

那就需要在 vite.config.js 中配置

export default defineConfig({server: {proxy: {'/api': {target: 'http://192.168.14.231:5400',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}}
})

然后前端请求 /api/algWebflux/getLog

最后在页面进行渲染就可以了

<div class="text-container">{{ formattedText }}</div>

http://www.lryc.cn/news/613073.html

相关文章:

  • RabbitMQ-日常运维命令
  • CS231n2017 Assignment3 RNN、LSTM部分
  • 3深度学习Pytorch-神经网络--全连接神经网络、数据准备(构建数据类Dataset、TensorDataset 和数据加载器DataLoader)
  • PID基础知识
  • 关于其他副脑类 GPTs 市场现状及研究报告
  • mysql全屏终端全量、部分备份、恢复脚本
  • Python面试题及详细答案150道(16-30) -- 数据结构篇
  • 分布式微服务--GateWay(过滤器及使用Gateway注意点)
  • 告别YAML,在SpringBoot中用数据库配置替代配置文件
  • word生成问题总结
  • 【遥感图像入门】近三年遥感图像建筑物细粒度分类技术一览
  • Day116 若依融合mqtt
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 音视频时间戳获取与同步原理详解
  • 【Docker】RustDesk远程控制-私有化部署开源版本
  • 生成式AI的“幽灵漏洞”:法律如何为技术的阴影划界
  • PCIe Base Specification解析(八)
  • 从配置到远程访问:如何用群晖NAS FTP+ Cpolar搭建稳定文件传输通道
  • 深入解析Three.js中的BufferAttribute:源码与实现机制
  • Linux下动态库链接的详细过程
  • C++位图(Bitmap)与布隆过滤器(Bloom Filter)详解及海量数据处理应用
  • vue3父组件把一个对象整体传入子组件,还是把一个对象的多个属性分成多个参数传入
  • C#中统计某个字符出现次数的最简单方法
  • Git `cherry-pick` 工具汇总
  • Numpy科学计算与数据分析:Numpy线性代数基础与实践
  • 第一个vue应用
  • 【Kubernetes】部署 kube-bench 实现 K8s 最佳实践
  • LeetCode 分类刷题:125. 验证回文串
  • LongVie突破超长视频生成极限:1分钟电影级丝滑视频,双模态控制告别卡顿退化
  • Postman接口测试入门