使用Koa去写一个API接口流程

1.项目的准备

1.1 安装包  npm init -y  快速创建一个 package.json文件   npm run koa

1.2 创建文件和目录结构

app.js  //项目入口文件

data/   //接口数据(.json结尾的文件)

middleware/

koa_response_data.js: // 处理业务逻辑的中间件,读取某个json文件的数据

koa_response_duration.js: //总耗时中间件 用于计算服务器消耗时长

koa_response_header.js: //响应头中间件  用于设置服务器响应头和跨域的

2.总耗时中间件的编写

2.1 它为第一层中间件(即在入口文件中它最先去创建使用)

2.2 计算所有中间件的执行时间(一进入时记录开始时间;其他所有中间件执行完后记录结束时间;两者相减)

2.3 设置响应头(X-Response-Time: xxxms)

具体代码:

// 计算服务器消耗时长的中间件
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')
}

3.响应头中间件

3.1 它为第二层中间件

3.2 获取mime类型 (application/json)

3.3 设置响应头(Content-Type:application/json;charset=UTF-8)

具体代码:

// 设置响应头的中间件
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()
}

4.业务逻辑中间件

4.1 它为第三层中间件

4.2 读取文件内容   (请求地址:http://127.0.0.1:8888/api/xxx

    获取请求的地址,拼接文件路径

    读取该路径对应文件的内容(读取时调用另一个读取函数)

4.3 设置响应体 (ctx.response.body)

读取函数代码:

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

具体代码:

// 处理业务逻辑的中间件,读取某个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)
  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()
}

5.允许跨域

5.1 实际是通过Ajax访问服务器

5.2 同源策略

    同协议\同域名\同端口

    当前页面的地址和Ajax获取数据的地址

5.3 设置响应头

app.use(async (ctx,next) => {
 ctx.set("Access-Control-Allow-Origin", "*")
  ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE")
  await next()
}) 

猜你喜欢

转载自blog.csdn.net/qq_48018288/article/details/127109548