【JS】- stompjs在vue中的集成使用


1、安裝依賴

yarn add stompjs
yarn add sockjs-client

2、引入

import Stomp from "stompjs";
import SockJS from "sockjs-client";

3、完整項目代碼

// 其實代碼本身自帶了心跳,但是有點小問題(忘了是什么),最后還是決定自己來監聽error並重新發起鏈接
let socketTimer = null

export default {
  name: "App",
  data() {
    return {
      stompClient: null,
    };
  },
  created() {
    this.initWebsocket();
  },
  destroyed() {
    // 頁面銷毀后記得關閉定時器
    clearInterval(socketTimer)
    this.closeWebsocket();
  },
  methods: {
    initWebsocket() {
      let socket = new SockJS("/socket/ws");
      this.stompClient = Stomp.over(socket);
      this.stompClient.debug = null
      this.stompClient.connect(
        { Author: "頭部信息" }, // 傳遞token
        () => {
          // 我們是gps項目,通過socket接收gps信息
          this.stompClient.subscribe("/topic/gps", (res) => {
            const row = JSON.parse(res.body)
            // 處理邏輯
            fn(row)
          });
          // 發送信息
          this.stompClient.send(
            "/app/test",
            {},
            JSON.stringify({ user: "user" })
          );
        },
        (err) => {
          // 監聽報錯信息,手動發起重連
          console.log("socketErr: ", err)
          if (socketTimer) {
            clearInterval(socketTimer)
          }
          // 10s后重新連接一次
          socketTimer = setTimeout(() => {
            console.log("開始重聯")
            this.initWebsocket();
          }, 10000);
        }
      );
      // this.stompClient.heartbeat.outgoing = 10000;
// 若使用STOMP 1.1 版本,默認開啟了心跳檢測機制(默認值都是10000ms)
// this.stompClient.heartbeat.incoming = 0;
// 客戶端不從服務端接收心跳包
}, closeWebsocket() { if (this.stompClient !== null) { this.stompClient.disconnect(() => { console.log("關閉連接"); }); } }, }, };

4、別忘了進行代理

// IP PORT 配置
const baseUrl = process.env.BASEURL
if (process.env.NODE_ENV === 'development') {
  // 實際代理轉發表
  exports.proxy = {
    '/api': {
      target: baseUrl,
      ws: true,
      pathRewrite: {
        '^/api': '/'
      }
    },
    '/socket': {
      target: baseUrl,
      changeOrigin: true,
      ws: true,
      pathRewrite: {
        '^/socket': '/'
      }
    },
  }
}
// 改成本地 IP
exports.host = process.env.HOST
exports.port = process.env.PORT

5、發布至線上之后

location ^~ /socket/ {
    proxy_pass http://127.0.0.1:1080/;
    # 增加Upgrade協議頭和Connection協議頭,使http連接升級到websocket連接
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

 

結尾:在實際使用的過程中,遇到了socket動不動就斷開重連的情況,雖然照目前看來不影響使用,但是還是決定使用mqtt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM