您现在的位置是:首页 > 技术教程 正文

在vue2中使用SSE(服务器发送事件)

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

SSE简介

SSE(Server-Sent Events,服务器发送事件)是围绕只读Comet 交互推出的API 或者模式。

SSE API允许网页获得来自服务器的更新,用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型必须是text/event-stream,而且是浏览器中的JavaScript API 能解析格式输出。

SSE 支持短轮询、长轮询和HTTP 流,而且能在断开连接时自动确定何时重新连接。

使用原因

之前系统通知公告等信息是通过每隔一段时间调用接口来判断是否有新的公告或通知,最开始想到的是用websocket,但是这场景只需要服务端往客户端发送消息,所以商量后决定使用SSE。

  1. // 使用这个库可以添加的请求头(比如添加token)
  2. import { EventSourcePolyfill } from "event-source-polyfill";
  3. import { getToken } from '@/utils/user'
  4. export default {
  5. data() {
  6. return {
  7. eventSource: null
  8. }
  9. },
  10. mounted() {
  11. this.createSSE()
  12. },
  13. methods: {
  14. createSSE(){
  15. if(window.EventSource){
  16. // 根据环境的不同,变更url
  17. const url = process.env.VUE_APP_MSG_SERVER_URL
  18.         // 用户userId
  19.         const { userId } = this.$store.state.user
  20. this.eventSource = new EventSourcePolyfill(
  21. `${url}/sse/connect/${userId}`, {
  22.           // 设置重连时间
  23. heartbeatTimeout: 60 * 60 * 1000,
  24.           // 添加token
  25.           headers: {
  26.     'Authorization': `Bearer ${getToken()}`,
  27.     },
  28. });
  29. this.eventSource.onopen = (e) => {
  30. console.log("已建立SSE连接~")
  31. }
  32. this.eventSource.onmessage = (e) => {
  33. console.log("已接受到消息:", e.data)
  34. }
  35. this.eventSource.onerror = (e) => {
  36. if (e.readyState == EventSource.CLOSED) {
  37. console.log("SSE连接关闭");
  38. } else if (this.eventSource.readyState == EventSource.CONNECTING) {
  39. console.log("SSE正在重连");
  40. //重新设置token
  41. this.eventSource.headers = {
  42. 'Authorization': `Bearer ${getToken()}`
  43. };
  44. } else {
  45. console.log('error', e);
  46. }
  47. };
  48. } else {
  49. console.log("你的浏览器不支持SSE~")
  50. }
  51. },
  52.     beforeDestroy() {
  53.   if(this.eventSource){
  54.   const { userId } = this.$store.state.user
  55.         // 关闭SSE
  56.     this.eventSource.close();
  57.         // 通知后端关闭连接
  58.     this.$API.system.msg.closeSse(userId)
  59.     this.eventSource = null
  60.     console.log("退出登录或关闭浏览器,关闭SSE连接~")
  61.     }
  62.     },

在createSSE被调用后,这个请求会一直在pending状态

直到服务端向客户端发送消息,状态才会改变

最后离开时记得关闭连接

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索