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

传递token

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

javascript 复制代码
    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、封装

javascript 复制代码
//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文件中使用

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

javascript 复制代码
// .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>
相关推荐
wanhengidc2 小时前
服务器机柜与网络机柜各自的优势
服务器·网络·智能路由器
网易独家音乐人Mike Zhou2 小时前
【Linux应用】开发板USB共享网络,网线或USB以太网共享网络(局域网连接PC和开发板,实现PC给开发板共享网络,USB通过NDIS驱动共享)
linux·网络·单片机·mcu·物联网·嵌入式·iot
托比-马奎尔2 小时前
第十二章:网络编程
网络
DoraBigHead3 小时前
比特的尽头,是世界的入口
网络协议
颖川初尘3 小时前
端口到底是个什么鬼?回答我!
服务器·网络·tcp/ip·node.js
daikaimiao5 小时前
https——TCP+TLS
网络协议·tcp/ip·https
nightunderblackcat6 小时前
新手向:Python网络编程,搭建简易HTTP服务器
网络·python·http
Yama1176 小时前
SSL与HTTP概述
网络协议·http·ssl
cui_win6 小时前
【网络】Linux 内核优化实战 - net.ipv4.tcp_congestion_control
linux·网络·tcp/ip
yqcoder7 小时前
12. 说一下 https 的加密过程
网络协议·http·https