随着项目的扩大,项目中的try catch会越来越多,项目会更加臃肿。在开始之前,先了解koa的执行多个中间件的洋葱模型。
洋葱模型
这是网上最常见的关于洋葱模型的示意图
先看一段代码
1 | router.get('/', (ctx: Context) => { |
运行后打开浏览器访问localhost:3000,打印如下
1 | mw1 start |
搭配洋葱模型,不难理解,next的作用到底是什么
next方法的执行,会指向下一个中间件,等待下一个中间件执行完毕,再返回当前中间件
1 | app.use(middleware1); |
根据这个next方法,就可以理解执行顺序了
- 执行middleware1,打印mw1 start,遇到next,跳到middleware2
- 执行middleware2,打印mw2 start,遇到next,跳到router.routes()
- router.routes()没有next,执行结束,返回上一个中间件middleware2
- middleware2中next的后面剩余部分执行,打印mw2 end,返回上一个中间件middleware1
- middleware1中next的后面剩余部分执行,打印mw1 end
将以上的知识结合到request和response上,可以得出一个答案
Koa 的洋葱模型指的是以 next() 函数为分割点,先由外到内执行 Request 的逻辑,再由内到外执行 Response 的逻辑
demo
github demo: https://github.com/ACE0220/blog-demos/tree/main/infrastructure/backend/global-error-aop
运行:pnpm dev:onion
简单版本的全局异常捕捉
根据洋葱模型的特性,那么在进入router中间件之前,我们就可以通过try catch包含着next方法,next方法执行的错误就可以捕获到
1 | import Koa from 'koa'; |
demo
github demo: https://github.com/ACE0220/blog-demos/tree/main/infrastructure/backend/global-error-aop
运行:pnpm dev:ge