【Koa】为什么一定要保证是洋葱模型呢?

    科技2025-08-01  3

    为什么一定要保证是洋葱模型呢?

    const Koa = require('koa'); const app = new Koa(); /* 聊一聊为什么我们通常需要在koa的中间件加上async,如果这个中间件有next的话,我们还需要在next()的前面加上await?什么原因呢? 结论:如果不加上async和await,那么koa中间件的执行顺序就不一定按照洋葱模型的顺序来执行 例子: app.use((ctx,next) => { console.log(1) next() console.log(2) }) app.use(async (ctx,next) => { console.log(3) const axios = require('axios'); const res = await axios.get('http://baidu.com') next() //这个加不加结果都一样,1 3 2 4 console.log(4) }) 执行结果:1 3 2 4 这样不是洋葱模型所得到的结果 因为当执行程序时,先是输出1,然后next()调用下一个中间件,输出3,遇到await时线程受到阻塞,那么js会去执行上一个中间件next()后面的代码 2, 等await取消线程阻塞后,才会执行最后面的4 所以不加async和await无法保证按照洋葱模型的顺序执行 ***************************************** 如何保证十几个甚至几十个中间件函数按照洋葱模型顺序执行呢? 关键:必须在每一个中间件函数前面加上async,同时如果某一个中间件函数有next(),那么一定要在next()前面加上await 保证中间件按洋葱模型执行的先决条件是: 要在每一个中间件调用下一个中间件的时候,它的next()前面都要加上await app.use(async (ctx,next) => { console.log(1) await next() console.log(2) }) app.use(async (ctx,next) => { console.log(3) const axios = require('axios'); const res = await axios.get('http://baidu.com') next() //不加await,因为只有两个中间件 console.log(4) }) 为什么一定要保证中间件的执行顺序是洋葱模型呢? 计时功能 */ app.use(async (ctx,next) => { console.log(1) await next() console.log(2) //下面这段代码执行是要有前提条件的:它必须等后面三个中间件执行完成后才生效 }) app.use(async (ctx,next) => { console.log(3) const axios = require('axios'); const res = await axios.get('http://baidu.com') await next() console.log(4) }) app.use app.use app.listen(3000)
    Processed: 0.011, SQL: 9