‌Koa2框架的web前后端访问和WebSocket的前后端通信

Koa2与WebSocket全栈通信指南

Koa2‌:是一个基于 Node.js 的 web 框架,主要用于构建服务器端应用。它提供了路由、中间件、请求处理等 HTTP 相关功能,简化了服务器开发。‌它本身不直接处理 WebSocket 连接,但可以通过插件或集成来支持。
‌WebSocket‌:是一种网络通信协议,运行在传输层(TCP 协议之上),用于在客户端和服务器之间建立持久的双向连接。它支持实时数据传输,如即时通讯、在线游戏等。‌通常通过模块(如 ws)在 Node.js 中实现,可以独立使用,也可以与 Koa2 集成,例如在 Koa2 项目中,可以通过 ws 模块创建 WebSocket 服务,并让它们共用同一个端口。‌

Koa2:node.js的web服务器开发框架。express与koa
后台项目开发步骤
安装:npm init -y 与 npm install koa 
在后端代码文件app.js中分以下3步
1,创建koa对象
const Koa=require('koa')
const app=new Koa()
2,编写响应函数(中间件)
//第一层中间件  next:下一个中间件,下一层中间件是否执行,取决于next这个函数有没有调用。ctx.response.body:响应体返回前端页面,ctx.request.url :请求信息头
app.use((ctx,next)=>{   
   console.log(ctx.request.url)
   ctx.response.body='hello world'
   console.log('第一层中间件...1')
   next()
   console.log('第一层中间件...2')
})
//第二层中间件
app.use(async (ctx,next)=>{
   console.log('第二层中间件...1')
   const ret = await next()
   console.log(ret)
   console.log('第二层中间件...2')
})
//第三层中间件
app.use((ctx,next)=>{
   console.log('第三层中间件')
   return 'i love the dog'
})
//require() 接收一个中间件函数 respDurationMiddleware, 绑定中间件  
const respDurationMiddleware =  require('./middleware/koa_response_duration')
// 绑定中间件  
app.use(respDurationMiddleware)
  // 设置响应数据的格式和编码方式
  const contentType = 'application/json; charset=utf-8'
  ctx.set('Content-Type', contentType)
  //ctx.response.body = '{"success": true}' 
  //设置响应头,允许跨域访问
  ctx.set("Access-Control-Allow-Origin", "*")
  ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE")
异步函数调用不能通过return返回调用函数的返回值,需要返回一个 Promise对象
// 读取文件的工具方法 file_utils.js 中定义getFileJsonData方法
const fs = require('fs')
module.exports.getFileJsonData = (filePath) => {
return new Promise((resolve, reject) => { 
  fs.readFile(filePath, 'utf-8', (error, data) => {
      if(error) {
        // 读取文件失败
        reject(error)
      } else {
        // 读取文件成功
        resolve(data)
      }
    })
 })
 }
const fileUtils = require('../utils/file_utils')
const ret = await fileUtils.getFileJsonData(filePath)
ctx.response.body = ret //数据赋值给响应体
3,绑定端口号,根据url读取指定目录下的文件内容
app.listen(8888)
node app.js  启动服务端

前端交互
前端axios组件安装 npm install axios 
在main.js中引入axios:import axios from 'axios'
// 请求基准路径的配置
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/'
// 将axios挂载到Vue的原型对象上
// 在别的组件中 this.$http 得到axios对象  $http是自己取得名字
Vue.prototype.$http = axios

Vue页面中获得数据:
// http://127.0.0.1:8888/api/seller
//解构data 赋值给 ret
 const { data: ret } = await this.$http.get('seller')
 将ret赋值给allData
 this.allData = ret


WebSocket:WebSocket 是 HTML5 定义的全双工通信协议,旨在解决 HTTP 协议的局限性(单向请求 - 响应、短连接),实现客户端与服务器的持久化双向通信,服务器端(Node.js + ws 库)。
其核心特点包括:
1,持久连接:通过一次 HTTP 握手建立连接后,保持 TCP 连接不关闭,避免频繁建立连接的开销。
2,全双工通信:连接建立后,客户端和服务器可随时向对方发送数据,无需等待对方响应。
3,轻量协议:数据帧格式简洁,比 HTTP 头部开销更小,适合实时场景(如聊天、实时数据监控、游戏等)。
后端依赖安装 npm install ws,后端代码文件app.js中分以下3步
1 创建对象:
const WebSocket = require('ws')
// 创建WebSocket服务端的对象, 绑定的端口号是9998
const wss = new WebSocket.Server({
  port: 9998
})
2 监听事件:
// 服务端开启了监听
module.exports.listen = () => {
    // 对客户端的连接事件进行监听
    //连接事件:client 代表的是客户端的连接socket对象
    wss.on('connection', client => {
    console.log('有客户端连接成功了...')
    // 对客户端的连接对象进行message事件的监听
    //接收数据事件: msg 由客户端发给服务端的数据
    client.on('message',async msg => {  
             console.log('客户端发送数据给服务端了: ' + msg)  
             
             //3 发送数据: 由服务端往客户端发送数据
             // client.send('hello socket from backend')
          })      
    })
}
node app.js  启动服务端


前端使用
1 创建WebSocket对象 const ws = new WebSocket('ws://localhost:9998')
2 监听事件:
连接成功事件 
ws.onopen = () => {
   console.log('连接服务端成功了')
}
  // 存储回调函数
  callBackMapping = {} 
接收服务端发送来数据事件
ws.onmessage = msg => {
      console.log('从服务端获取到了数据')
      // 真正服务端发送过来的原始数据时在msg中的data字段
      console.log(msg.data)
        // 真正服务端发送过来的原始数据时在msg中的data字段
      // console.log(msg.data)
      const recvData = JSON.parse(msg.data)
      const socketType = recvData.socketType
      // 判断回调函数是否存在
      if (this.callBackMapping[socketType]) {
        const action = recvData.action
        if (action === 'getData') {
          const realData = JSON.parse(recvData.data)
          this.callBackMapping[socketType].call(this, realData)
        } else if (action === 'fullScreen') {
          this.callBackMapping[socketType].call(this, recvData)
        } else if (action === 'themeChange') {
          this.callBackMapping[socketType].call(this, recvData)
        }
      }
}

 // 回调函数的注册,callBack  callBackMapping[trendData]=getData
  registerCallBack (socketType, callBack) {
    this.callBackMapping[socketType] = callBack
  }

  // 取消某一个回调函数
  unRegisterCallBack (socketType) {
    this.callBackMapping[socketType] = null
  }

关闭连接事件
ws.onclose = () => {
      console.log('连接服务端失败')
}
3 发送数据:从前端发送数据到后端
ws.send(JSON.stringify(data))
在main.js中挂载 SocketService对象到Vue的原型对象上
import SocketService from '@/utils/socket_service'
// 对服务端进行websocket的连接
SocketService.Instance.connect()
// 其他的组件  this.$socket  $socket是自己取得名字
Vue.prototype.$socket = SocketService.Instance


Vue页面中的使用
created () {
    // 在组件创建完成之后 进行回调函数的注册
    //socketType: 'trendData' 绑定的回调函数 callBack:this.getData
    this.$socket.registerCallBack('trendData', this.getData)
  },
destroyed () {
    window.removeEventListener('resize', this.screenAdapter)
    // 在组件销毁的时候, 进行回调函数的取消
    this.$socket.unRegisterCallBack('trendData')
  },
mounted () {
    this.initChart()
    // this.getData()
    // 发送数据给服务器, 告诉服务器, 我现在需要数据
    //触发注册的回调函数registerCallBack('trendData', this.getData),执行ws.onmessage中的this.callBackMapping[socketType].call(this, realData),即调用Vue页面中的getData (ret)
    this.$socket.send({
      action: 'getData',
      socketType: 'trendData',
      chartName: 'trend',
      value: ''
    })
    window.addEventListener('resize', this.screenAdapter)
    this.screenAdapter()
  },
 // ret 就是服务端发送给客户端的图表的数据
getData (ret) {
   //  this.allData  从服务器中获取的所有数据
      this.allData = ret
      console.log(this.allData)
      this.updateChart()
    },  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值