其他分享
首页 > 其他分享> > 638 KOA2的使用:介绍,快速上手,中间件的特点,后台项目的开发

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

总结:


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()
}

标签:...,const,638,ctx,中间件,next,KOA2,console
来源: https://www.cnblogs.com/jianjie/p/14449333.html