zoukankan      html  css  js  c++  java
  • 638 KOA2的使用:介绍,快速上手,中间件的特点,后台项目的开发

    1.KOA2的介绍


    2.KOA2的快速上手



    myApp.js

    const Koa = require('koa');
    const app = new Koa()
    
    app.use((ctx, next) => {
      console.log(ctx)
      ctx.response.body = '哈哈哈'
    })
    
    app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
    

    3.KOA2中间件的特点


    app.js

    // 1.创建koa对象
    const Koa = require('koa')
    const app = new Koa()
    
    // 2.编写响应函数(中间件)
    // ctx: 上下文, web容器, ctx.request ctx.response
    // next: 下一个中间件, 下一层中间件是否能够得到执行, 取决于next这个函数有没有被调用
    app.use((ctx, next) => {
      console.log('第一层中间件...1')
      ctx.response.body = '<h2>hello world</h2>'
      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'
    })
    
    // 3.绑定端口号 3000
    app.listen(3000, () => console.log('服务器在3000端口启动成功^-^'))
    

    结果

    服务器在3000端口启动成功^-^
    第一层中间件...1
    第二层中间件...1
    第三层中间件
    第一层中间件...2
    i love the dog
    第二层中间件...2
    
    第一层中间件...1
    第二层中间件...1
    第三层中间件
    第一层中间件...2
    i love the dog
    第二层中间件...2
    

    总结:

    • 1、不加async、await,next()的执行结果是一个promise对象。
    • 2、执行到第一个next(),会暂停执行该中间件的代码,先去执行下一个 中间件的代码。

    myApp.js

    const Koa = require('koa');
    const app = new Koa()
    
    app.use((ctx, next) => {
      ctx.response.body = '<h2>哈哈哈</h2>'
      console.log('第一层中间件...1')
      next()
      console.log('第一层中间件...2')
    })
    
    app.use((ctx, next) => {
      console.log('第2层中间件...1')
      const res = next()
      console.log('res---', res)
      console.log('第2层中间件...2')
    })
    
    app.use((ctx, next) => {
      console.log('第3层中间件...1')
      return 'i love the dog'
    })
    
    app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
    

    打印结果

    服务器在8000端口启动成功~~
    第一层中间件...1
    第2层中间件...1
    第3层中间件...1
    res--- Promise { 'i love the dog' }
    第2层中间件...2
    第一层中间件...2
    
    第一层中间件...1
    第2层中间件...1
    第3层中间件...1
    res--- Promise { 'i love the dog' }
    第2层中间件...2
    第一层中间件...2
    

    myApp.js

    const Koa = require('koa');
    const app = new Koa()
    
    app.use((ctx, next) => {
      ctx.response.body = '<h2>哈哈哈</h2>'
      console.log('第一层中间件...1')
      next()
      console.log('第一层中间件...2')
    })
    
    app.use(async (ctx, next) => {
      console.log('第2层中间件...1')
      const res = await next()
      console.log('res---', res)
      console.log('第2层中间件...2')
    })
    
    app.use((ctx, next) => {
      console.log('第3层中间件...1')
      return 'i love the dog'
    })
    
    app.listen(8000, () => console.log('服务器在8000端口启动成功~~'))
    

    打印结果

    服务器在8000端口启动成功~~
    第一层中间件...1
    第2层中间件...1
    第3层中间件...1
    第一层中间件...2
    res--- i love the dog
    第2层中间件...2
    第一层中间件...1
    第2层中间件...1
    第3层中间件...1
    第一层中间件...2
    res--- i love the dog
    第2层中间件...2
    

    4.后台项目的开发



    app.js

    // 服务器的入口文件
    // 1.创建KOA的实例对象
    const Koa = require('koa')
    const app = new Koa()
    
    const respDurationMiddleware =  require('./middleware/koa_response_duration')
    const respHeaderMiddleware = require('./middleware/koa_response_header')
    const respDataMiddleware = require('./middleware/koa_response_data')
    
    // 2.绑定中间件
    // 绑定第一层中间件
    app.use(respDurationMiddleware)
    
    // 绑定第二层中间件
    app.use(respHeaderMiddleware)
    
    // 绑定第三层中间件
    app.use(respDataMiddleware)
    
    // 3.绑定端口号 8888
    app.listen(8888, () => console.log(`服务器在8888端口启动成功~~`))
    

    file_utils.js

    // 读取文件的工具方法
    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)
          }
        })
      })
    }
    

    koa_response_duration.js

    // 计算服务器消耗时长的中间件
    module.exports = async (ctx, next) => {
      // 记录开始时间 【Date.now()得到的是时间戳,和+new Date()一样。】
      const start = Date.now() 
      // 让内层中间件得到执行
      await next()
      // 记录结束的时间
      const end = Date.now()
      const duration = end - start
      // ctx.set 设置响应头 X-Response-Time 【不要漏了加 ms。】
      ctx.set('X-Response-Time', duration + 'ms')
    }
    

    koa_response_header.js

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

    koa_response_data.js

    // 处理业务逻辑的中间件,读取某个json文件的数据
    const path = require('path')
    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)
      console.log(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)
      }
    
      await next()
    }
    
  • 相关阅读:
    拓端数据tecdat|R语言多元逐步回归模型分析房价和葡萄酒价格:选择最合适的预测变量
    拓端tecdat|R语言文本挖掘NASA数据网络分析,tf-idf和主题建模
    拓端tecdat|R语言资产配置: 季度战术资产配置策略研究
    拓端tecdat|R语言HAR和HEAVY模型分析高频金融数据波动率
    拓端tecdat|自然语言处理NLP:情感分析疫情下的新闻数据
    拓端tecdat|R语言中的SOM(自组织映射神经网络)对NBA球员聚类分析
    拓端tecdat|R语言:逻辑回归ROC曲线对角线分析过程及结果
    拓端tecdat|bilibili视频流量数据潜望镜
    codeforces#510 Div2
    树链剖分
  • 原文地址:https://www.cnblogs.com/jianjie/p/14449333.html
Copyright © 2011-2022 走看看