1、koa2
- 支持async\await
- 洋葱模型中间件
2、快速上手
2.1、安装koa
npm init -y
npm install koa
2.2、创建并编写app.js
- 创建koa对象
- 编写响应函数(中间件)
- 监听端口
- 启动服务器
//1.创建koa对象
const Koa = require("koa");
const app=new Koa();
//2.编写响应函数(中间件)
//ctx:上下文,ctx.request,ctx.response
//next:下一个中间件,下一层中间件是否能够得到执行,取决于next这个函数有没有得到调用
app.use((ctx,next)=>{
console.log(ctx.request.url);
ctx.response.body='hello,world'
})
//3.绑定端口号
app.listen(3000);
2.3、验证洋葱模型
中间件特点
- koa对象通过use方法加入一个中间件
- 一个中间件就是一个函数
- 中间件的执行顺序符合洋葱模型
- 内层中间件的是否执行取决于外层中间件的next()函数是否调用
- 调用next函数得到的是promise对象
const Koa = require("koa");
const app=new Koa();
app.use((ctx,next)=>{
console.log('第一层中间件********1');
ctx.response.body='hello,world';
next();
console.log("第一层中间件********2")
})
app.use((ctx,next)=>{
console.log('第二层中间件********1');
next();
console.log("第二层中间件********2")
})
app.use((ctx,next)=>{
console.log('第三层中间件');
})
app.listen(3000);
const Koa = require("koa");
const app=new Koa();
app.use((ctx,next)=>{
// console.log('第一层中间件********1');
ctx.response.body='hello,world';
next();
// console.log("第一层中间件********2")
})
app.use((ctx,next)=>{
// console.log('第二层中间件********1');
const ret=next();
console.log(ret);
// console.log("第二层中间件********2")
})
app.use((ctx,next)=>{
// console.log('第三层中间件');
return "i love javascript";
})
app.listen(3000);
2.4、nodemon
让服务器修改后自动重启动保存工具
npm i nodemon
执行重启动,每次修改后保存就可以重启动服务器端口了
nodemon app.js
3、搭建后台
在data文件下存放做好的json数据
三个中间件
文件读取模块
//app.js
const Koa = require("koa");
const app=new Koa();
const respDurationMiddleware=require('./middleware/koa_response_duration.js');
const respHeaderMiddleWare=require('./middleware/koa_response_header.js');
const respDataMiddleWare=require('./middleware/koa_response_data.js');
app.use(respDurationMiddleware);
app.use(respHeaderMiddleWare);
app.use(respDataMiddleWare);
app.listen(3000);
//koa_response_data.js
//接口数据
const path=require('path')
const fileUtils = require("../utils/file_utils.js");
module.exports=async(ctx,next)=>{
const url=ctx.request.url;
//对接口url进行字符串处理
let filePath=url.replace('/api','');
//处理成文件路径
filePath='../data'+filePath+'.json';
filePath=path.join(__dirname,filePath);
//文件读取
try{
const ret=await fileUtils.getFileJsonData(filePath);
ctx.response.body=ret;
}
catch(error){
const errMsg={
message:"文件资源不存在",
state:404
}
ctx.response.body=JSON.stringify(errMsg);
}
console.log(filePath);
await next();
}
//koa_response_duration.js
//计算请求响应时间
module.exports=async(ctx,next)=>{
const start=Date.now()
await next();
const end=Date.now();
const duation=end-start;
//添加到响应头里
ctx.set('X-Response-Time',duation+'ms')
}
//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();
}
//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);
}
})
})
}