微信截图_20210225141337.png

中间件

微信截图_20210225151004.png
微信截图_20210225151012.png

使用

  1. // 最外层中间件,可以用于兜底 Koa 全局错误
  2. app.use(async (ctx, next) => {
  3. try {
  4. // console.log('中间件 1 开始执行')
  5. // 执行下一个中间件
  6. await next();
  7. // console.log('中间件 1 执行结束')
  8. } catch (error) {
  9. console.log(`[koa error]: ${error.message}`)
  10. }
  11. });
  12. // 第二层中间件,可以用于日志记录
  13. app.use(async (ctx, next) => {
  14. // console.log('中间件 2 开始执行')
  15. const { req } = ctx;
  16. console.log(`req is ${JSON.stringify(req)}`);
  17. await next();
  18. console.log(`res is ${JSON.stringify(ctx.res)}`);
  19. // console.log('中间件 2 执行结束')
  20. });

实现中间件

  1. const app = {
  2. middlewares: []
  3. };
  4. app.use = function(fn) {
  5. app.middlewares.push(fn);
  6. };
  7. app.compose = function() {
  8. function dispatch(index) {
  9. // async 函数中 await 后面执行的异步代码要实现等待,带异步执行后继续向下执行,需要等待 Promise,
  10. // 所以我们将每一个中间件函数在调用时最后都返回了一个成功态的 Promise
  11. if (index === app.middlewares.length) return Promise.resolve();
  12. const route = app.middlewares[index];
  13. return Promise.resolve(route(() => dispatch(index + 1)));
  14. }
  15. dispatch(0);
  16. }
  17. module.exports = app;

装饰器和中间件

资料

  1. 给你一个开箱即用,功能完善的 koa 项目
  2. Koa2 进阶学习笔记
  3. Koa.js 设计模式-学习笔记
  4. Koa2 洋葱模型 ——— compose 串联中间件的四种实现
  5. 在Web应用中使用装饰器(Decorator)初体验