vue和node使用websocket实现数据推送,实时聊天

需求:node做后端根据websocket,连接数据库,数据库的字段改变后,前端不用刷新页面也能更新到数据,前端也可以发送消息给后端,后端接受后把前端消息做处理再推送给前端展示

1.初始化node,生成package.json和package-lock.js

复制代码
 npm init -y

2.安装express、socket.io、cors

3.创建app.js并编写代码

使用node ./websocket.js运行项目

复制代码
npm install express socket.io cors -S

建立websocket.js

复制代码
const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http);
const fs = require('fs');
const cors = require('cors');
// 使用 cors 中间件允许跨域请求
// 配置跨域选项
const corsOptions = {
  origin: '*', // 指定允许的来源
  methods: ['GET', 'POST'], // 允许的请求方法
  credentials: true // 允许发送凭据(如 cookies)
};
app.use(cors(corsOptions));
// 创建数据库连接
const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',//数据库连接域名
  user: 'root',//数据库账号
  password: '123456',//密码
  database: 'graduation_design'//要连接的数据库名
});
connection.connect();
 
// 监听客户端连接事件
io.on('connection', (socket) => {
  console.log('A client connected');
  //查询表
  connection.query('SELECT * FROM shelves', (error, results) => {
    if (error) throw error;
    //数据推送到前端
    socket.emit('data', results);
  },)
  // 发送数据到客户端
  setInterval(() => {
    // 查询数据库并发送数据到客户端
    connection.query('SELECT * FROM shelves', (error, results) => {
      if (error) throw error;
      socket.emit('data', results);
    },)
  }, 60 * 1000);
  //接收到客户端的消息后再推送给客户端
  socket.on('message', (message) => {
    console.log('接收到客户端消息:', message);
    socket.emit("messagedata", message);
  })
 
  // 监听客户端断开连接事件
  socket.on('disconnect', () => {
    console.log('A client disconnected');
  });
});
 
// 启动服务器
http.listen(3000, () => {
  console.log('WebSocket server is running on port 3333');
});

4.前端使用socket.io-client

复制代码
npm install socket.io-client

在需要使用websocket连接的页面引入

复制代码
<template>
    <div class="content-box">
        <div class="container">
            {{ data }}
            <el-button @click="connectWebscoket">连接websocket</el-button>
            <el-button @click="gasong">发送</el-button>
            <el-button @click="stop">停止连接</el-button>
            <hr />
            {{ msgdata }}
        </div>
    </div>
</template>
 
<script>
import io from 'socket.io-client'
let socket = null
export default {
    data() {
        return {
            data: null,
            msgdata: ''
        }
    },
    mounted() {},
    methods: {
        connectWebscoket() {
            // 解决跨域问题
            socket = io('http://localhost:3333', {
                transports: ['websocket'],
                withCredentials: true, //白名单
                extraHeaders: {
                    //请求头
                    'Access-Control-Allow-Origin': 'http://localhost:8080'
                }
            })
            socket.on('data', (data) => {
                this.data = data
            })
            socket.on('messagedata', (msg) => {
                this.msgdata = msg
            })
        },
        gasong() {
            socket.send('Hello from client!')
        },
        stop() {
            socket.close()
        }
    }
}
</script>
 
<style lang="scss" scoped></style>

此时已经建立好websocket的连接

相关推荐
CarIise5 分钟前
CSS选择器与样式关联
前端·css·tensorflow
里欧跑得慢1 小时前
CSS 模块化架构的演进:BEM、CSS Modules 到 CSS-in-JS 的反思
前端·css·flutter·web·css-in-js
IT_陈寒1 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端
小灰灰搞电子2 小时前
Rust+Slint 实现温度计源码分享
前端·rust·slint
计算机魔术师2 小时前
面壁智能 OpenBMB 推出 MathForm,面向 Lean 4 数学自动形式化的开源框架、数据集与模型
前端
NeilCarmack3 小时前
Deepseek-harness增加桌面版端序列:第 2 讲 · spawn Electron:当前进程如何“交棒“
前端·javascript·electron
上海魁鲸科技有限公司3 小时前
APS高级排产系统到底有什么用?一文讲清功能、选型与落地建议
前端·microsoft·excel
陈随易3 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
东风破_5 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript
DS随心转插件5 小时前
Grok生成的html怎么导出——AI导出鸭:大模型结构化输出的“最后一公里”工程化解构
前端·人工智能·ai·html·豆包·deepseek·ai导出鸭