在vue项目中webSocket封装(传token)

发布时间:2023-12-20 11:57:01

传递token

????????在websocket中,目前未提供修改请求头字段的方法,参考其他的一些文章,依照他们的写法依然未能实现传递token,所有我和后端另辟蹊径,把token传在路径里面。

    let wsUrl = "ws://39.101.77.206:8181/march/admin/interviewRecord/InterviewRecord";

 //从pinia获取token数据
     const user = userLogin()
 //按照后端的要求拼接token数据
     const token = `Bearer ${user.userInfo.token}`
     console.log(token);
 // ws请求完整地址
    const requstWsUrl = `${wsUrl}?token=${encodeURIComponent(token)}`
 //建立链接
    websock = new WebSocket(requstWsUrl)

?websocket封装

? ? ? ? 1、封装

//websocket.js

import { ElMessage } from "element-plus";
import { userLogin } from '@/stores/user.js';

let websock = null
let messageCallback = null
let errorCallback = null
let wsUrl = "ws://39.101.77.206:8181/march/admin/interviewRecord/InterviewRecord";

// 接收ws后端返回的数据
function websocketonmessage(e) {
    console.log(e, "接收后端返回的数据");
    messageCallback(JSON.parse(e.data))
}

/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
export function websocketSend(agentData) {
    // 加延迟是为了尽量让ws连接状态变为OPEN   
    setTimeout(() => {
        // 添加状态判断,当为OPEN时,发送消息
        if (websock.readyState === websock.OPEN) { // websock.OPEN = 1 
            // 发给后端的数据需要字符串化
            websock.send(JSON.stringify(agentData))
        }
        if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3 
            console.log('websock.readyState=3')
            ElMessage.error('ws连接异常,请稍候重试')
            errorCallback()
        }
    }, 500)
}

// 关闭ws连接
function websocketclose(e) {
    // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
    // e.code !== 1000  表示非正常关闭。
    if (e && e.code !== 1000) {
        ElMessage.error('ws连接关闭')
    }
}
// 建立ws连接
function websocketOpen(e) {
    console.log('ws连接成功', e)
}

// 初始化weosocket
export function initWebSocket() {
    if (typeof (WebSocket) === 'undefined') {
        ElMessage.error('您的浏览器不支持WebSocket,无法获取数据')
        return false
    }
    //从pinia获取token数据
    const user = userLogin()
    //按照后端的要求拼接token数据
    const token = `Bearer ${user.userInfo.token}`
    // ws请求完整地址
    const requstWsUrl = `${wsUrl}?token=${encodeURIComponent(token)}`
    //建立链接
    websock = new WebSocket(requstWsUrl)

    websock.onmessage = function (e) {
        websocketonmessage(e)
    }
    websock.onopen = function () {
        websocketOpen()
    }
    websock.onerror = function () {
        ElMessage.error('ws连接异常,请稍候重试')
        errorCallback()
    }
    websock.onclose = function (e) {
        websocketclose(e)
    }
}

/**
 * 发起websocket请求函数
 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket(successCallback, errCallback) {
    initWebSocket()
    messageCallback = successCallback
    errorCallback = errCallback
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
    console.log("关闭链接")
    if (websock) {
        console.log("关闭连");
        websock.close() // 关闭websocket
        websock.onclose() // 关闭websocket
    }
}

????????2、在vue文件中使用

? ? ? ? 这样写就可以长久的建立链接。

// .vue

<template>
     <Editor
         v-model="content"
         mode="default"
         @onBlur="handleBlur(scoped.row.Record[index])"
      />
</template>

<script setup>

import { ref, onMounted, onBeforeUnmount } from "vue";

import {
  sendWebsocket,
  closeWebsocket,
  websocketSend,
} from "@/utils/websocket.js";


onMounted(() => {
  sendWebsocket(wsMessage, wsError);
});

//富文本框失去焦点
const handleBlur = (e) => {
  // 发起ws数据
  websocketSend(e);
};

// 监听服务器传来的变化
const wsMessage = (data) => {
  const dataJson = data;
  // 这里写拿到数据后的业务代码
  console.log(dataJson)
};

const wsError = () => {
  // 比如取消页面的loading
  console.log("ws连接错误的回调函数");
};

// 页面销毁时关闭ws。因为有可能ws连接接收数据尚未完成,用户就跳转了页面
// 在需要主动关闭ws的地方都可以调用该方法
onBeforeUnmount(() => {
  closeWebsocket();
});

<script>
文章来源:https://blog.csdn.net/m0_66570642/article/details/135028682
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。