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

SSE简介

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

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

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

使用原因

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

// 使用这个库可以添加的请求头(比如添加token)
import { EventSourcePolyfill } from "event-source-polyfill";
import { getToken } from '@/utils/user'
export default {
  data() {
    return {
      eventSource: null
    }
  },
  mounted() {
    this.createSSE()
  },
  methods: {
    createSSE(){
      if(window.EventSource){
        // 根据环境的不同,变更url
        const url = process.env.VUE_APP_MSG_SERVER_URL
        // 用户userId
        const { userId } = this.$store.state.user
        this.eventSource = new EventSourcePolyfill(
          `${url}/sse/connect/${userId}`, {
          // 设置重连时间
          heartbeatTimeout: 60 * 60 * 1000,
          // 添加token
          headers: {
             'Authorization': `Bearer ${getToken()}`,
          },
        });
        this.eventSource.onopen = (e) => {
          console.log("已建立SSE连接~")
        }
        this.eventSource.onmessage = (e) => {
          console.log("已接受到消息:", e.data)
        }
        this.eventSource.onerror = (e) => {
          if (e.readyState == EventSource.CLOSED) {
            console.log("SSE连接关闭");
          } else if (this.eventSource.readyState == EventSource.CONNECTING) {
            console.log("SSE正在重连");
            //重新设置token
            this.eventSource.headers = {
              'Authorization': `Bearer ${getToken()}`
            };
          } else {
            console.log('error', e);
          }
        };
      } else {
        console.log("你的浏览器不支持SSE~")
      }
    },
    beforeDestroy() {
      if(this.eventSource){
          const { userId } = this.$store.state.user
          // 关闭SSE
          this.eventSource.close();
          // 通知后端关闭连接
          this.$API.system.msg.closeSse(userId)
          this.eventSource = null
          console.log("退出登录或关闭浏览器,关闭SSE连接~")
       }
    },

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

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

最后离开时记得关闭连接

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue2无法直接使用pytz库,因为Vue2是一个JavaScript框架,而pytz是一个Python库。如果你需要在Vue2使用pytz,你需要通过编写一个Python后端API来实现。 首先,你需要在Python编写一个API,使用pytz库来实现你需要的功能,并将其部署到一个服务器上。然后,在Vue2,你可以使用Axios或其他HTTP请求库来发送请求到你的API,并获取pytz库返回的数据。 举个例子,你可以编写一个Python Flask应用来实现API。首先,安装Flask和pytz库: ``` pip install flask pip install pytz ``` 然后,编写一个API,如下所示: ``` from flask import Flask, jsonify import pytz import datetime app = Flask(__name__) @app.route('/pytz') def get_pytz(): eastern = pytz.timezone('US/Eastern') dt = datetime.datetime.now(eastern) return jsonify({'time': str(dt)}) if __name__ == '__main__': app.run() ``` 在上面的代码,我们定义了一个路由`/pytz`,当发送GET请求到该路由时,它将返回当前美国东部时区的时间。 最后,在Vue2,你可以使用Axios来发送请求到你的API,如下所示: ``` <template> <div> <p>{{ time }}</p> </div> </template> <script> import axios from 'axios'; export default { data() { return { time: null, }; }, mounted() { axios.get('/pytz') .then((response) => { this.time = response.data.time; }) .catch((error) => { console.log(error); }); }, }; </script> ``` 在上面的代码,我们使用Axios发送一个GET请求到`/pytz`路由,并将返回的时间显示在页面上。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值