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