1. Koa2 中间件
-
为什么使用中间件
- 拆分业务模块,使代码清晰
- 统一使用中间件,使得各业务代码都规范标准
- 扩展性好,易添加、易删除
-
Koa2 业务代码都是中间件
- 所有的 app.use(…) 都是中间件
- 路由也是中间件(只不过限制了 url 规则)
- 每个中间件都有 async 函数 ,第一个参数是 ctx ,第二个参数是 next
-
运用中间件
app.js 中加入:(注册路由之前)
// 模拟登陆(为了使用中间件) app.use(async (ctx, next) => { const query = ctx.query if (query.user === '张三') { // 模拟登录成功 await next() // 执行下一步中间件 } else { // 模拟登录失败 ctx.body = '请登录' } })
-
async await 执行顺序
代码要放在浏览器中执行(复制到控制台回车)
await 后的函数执行完后,下面的代码才会执行
// 加载一张图片 async function getImg(url = '') { await fetch(url) // 加载图片 } async function fn() { const url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg' const start = Date.now() // 记录当前时间 await getImg(url) // 调用,加载图片 const ms = Date.now()-start // 计算时间差 console.log(`加载图片花费了 ${ms} 毫秒`) } fn()
执行顺序:1. fn ; 2.getImg 3. fn
-
演示 koa2 中间件的洋葱圈模型
// 演示 koa2 中间件的洋葱圈模型 const Koa = require('koa'); const app = new Koa(); // logger app.use(async (ctx, next) => { await next(); // 先执行下一个中间件 const rt = ctx.response.get('X-Response-Time'); // 获取时间差 console.log(`${ctx.method} ${ctx.url} - ${rt}`); }); // x-response-time app.use(async (ctx, next) => { const start = Date.now(); await next(); // 执行下一个中间件 const ms = Date.now() - start; // 计算时间差 ctx.set('X-Response-Time', `${ms}ms`); // 记录/设置时间差 }); // response app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000); console.log('koa2 已经开始监听 3000 端口')