• Koa2中间件计算响应总耗时/设置响应头/读取Json文件返回给客户端


    一、项目目录结构

     data:存放Json文件,Json文件中包含了返回给客户端的数据

    middleware:包含中间件 koa-response-duration.js、koa-response-header.js、koa-response-data.js 文件

    service:包含web_socket_service.js,用于处理来自于客户端的连接

    二、代码

    1、服务器的入口文件: app.js 

    // 服务器的入口文件
    // 1.创建KOA的实例对象
    const Koa = require('koa')
    const app = new Koa()
    // 2.绑定中间件
    // 绑定第一层中间件
    const respDurationMiddleware =  require('./middleware/koa_response_duration')
    app.use(respDurationMiddleware)
    // 绑定第二层中间件
    const respHeaderMiddleware = require('./middleware/koa_response_header')
    app.use(respHeaderMiddleware)
    // 绑定第三层中间件
    const respDataMiddleware = require('./middleware/koa_response_data')
    app.use(respDataMiddleware)
    // 3.绑定端口号 8888
    app.listen(8888)
    
    const webSocketService = require('./service/web_socket_service')
    // 开启服务端的监听, 监听客户端的连接
    // 当某一个客户端连接成功之后, 就会对这个客户端进行message事件的监听
    webSocketService.listen()
    View Code

    2、在service目录下,创建web-socket-service.js文件:通过WebSocketService服务端对象,监听来自客户端的连接,即可以通过别的客户端连接到你pc

    const path = require('path')
    const fileUtils = require('../utils/file_utils')
    const WebSocket = require('ws')
    // 创建WebSocket服务端的对象, 绑定的端口号是9998
    const wss = new WebSocket.Server({
      port: 9998
    })
    // 服务端开启了监听
    module.exports.listen = () => {
      // 对客户端的连接事件进行监听
      // client:代表的是客户端的连接socket对象
      wss.on('connection', client => {
        console.log('有客户端连接成功了...')
        // 对客户端的连接对象进行message事件的监听
        // msg: 由客户端发给服务端的数据
        client.on('message',async msg => {
          console.log('客户端发送数据给服务端了: ' + msg)
          let payload = JSON.parse(msg)
          const action = payload.action
          if (action === 'getData') {
            let filePath = '../data/' + payload.chartName + '.json'
            // payload.chartName // trend seller map rank hot stock
            filePath = path.join(__dirname, filePath)
            const ret = await fileUtils.getFileJsonData(filePath)
            // 需要在服务端获取到数据的基础之上, 增加一个data的字段
            // data所对应的值,就是某个json文件的内容
            payload.data = ret
            client.send(JSON.stringify(payload))
          } else {
            // 原封不动的将所接收到的数据转发给每一个处于连接状态的客户端
            // wss.clients // 所有客户端的连接
            wss.clients.forEach(client => {
              client.send(msg)
            })
          }
          // 由服务端往客户端发送数据
          // client.send('hello socket from backend')
        })
      })
    }
    View Code

    3、定义处理数据的中间件方法

      koa-response-duration.js:设置服务器相应时间的中间件,在浏览器中可以查看本次相应时间

    // 计算服务器消耗时长的中间件
    module.exports = async (ctx, next) => {
      // 记录开始时间
      const start = Date.now()
      // 让内层中间件得到执行
      await next()
      // 记录结束的时间
      const end = Date.now()
      // 设置响应头 X-Response-Time
      const duration = end - start
      // ctx.set 设置响应头
      ctx.set('X-Response-Time', duration + 'ms')
    }
    View Code

      koa-response-header.js:  设置响应头的中间件,可以设置跨域

    // 设置响应头的中间件
    module.exports = async (ctx, next) => {
      const contentType = 'application/json; charset=utf-8'
      ctx.set('Content-Type', contentType)
      ctx.set("Access-Control-Allow-Origin", "*")
      ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE")
      await next()
    }
    View Code

      koa-response-data.js:  处理业务逻辑的中间件,读取某个json文件的数据

    // 处理业务逻辑的中间件,读取某个json文件的数据
    const path = require('path') //建议使用es6的绝对路径处理方式,当你移动项目后还是能定位到
    const fileUtils = require('../utils/file_utils') 
    module.exports = async (ctx, next) => {
      // 根据url
      const url = ctx.request.url // /api/seller   ../data/seller.json
      let filePath = url.replace('/api', '') //  /seller
      filePath = '../data' + filePath + '.json'  // ../data/seller.json
      filePath = path.join(__dirname, filePath)
      try {
        const ret = await fileUtils.getFileJsonData(filePath)
        ctx.response.body = ret
      } catch (error) {
        const errorMsg = {
          message: '读取文件内容失败, 文件资源不存在',
          status: 404
        }
        ctx.response.body = JSON.stringify(errorMsg)
      }
     
      console.log(filePath)
      await next()
    }
    View Code

    访问结果:可以直接在浏览器中通过url地址,就可以访问到json数据,并返回给浏览器

      

  • 相关阅读:
    请问大侠,为什么将Trusted_Connection=true改为Trusted_Connection=false可以消除错误:"用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。"?
    以前本地机装的是DOTNETNUKE2.0.3好用的,现在装DOTNETNUKE2.1.2出问题了...,请帮忙
    solution to display [PAGETITLE] when using smculloch's skin for dotnetnuke
    Solution to 'DotNetNuke unavailable' when using vs.net open DotNetNuke.sln
    非过程式编程语言
    Visual Studio .NET 无法创建应用程序 。问题很可能是因为本地 Web 服务器上没有安装所需的组件
    Design Samples & Dotnetnuke Skins
    在web host 的DotNetNuke中添加连接时出现的错误及解决办法
    STL中的unique()和lower_bound ,upper_bound
    读书笔记 UltraGrid(2)
  • 原文地址:https://www.cnblogs.com/ibear/p/14755367.html
Copyright © 2020-2023  润新知