0
点赞
收藏
分享

微信扫一扫

Koa的洋葱模型到底是什么?

邯唐情感 2022-04-14 阅读 143

什么是Koa?

  1. 将node原生的req和res封装成为一个context对象。
  2. 基于async/await的中间件洋葱模型机制。

Koa1和Koa2在源码上的区别有何不同?

  1. Koa1是使用generator、yield的模式。
  2. Koa2使用的是async/await + Promise的模式。

什么是洋葱模型?

image.png

const Koa = require('koa');

//Applications
const app = new Koa();

// 中间件1
app.use((ctx, next) => {
  console.log(1);
  next();
  console.log(2);
});

// 中间件 2 
app.use((ctx, next) => {
  console.log(3);
  next();
  console.log(4);
});

app.listen(7000, '0.0.0.0', () => {
    console.log(`Server is starting`);
});

源码解析

  1. use方法
  1. listen方法
  1. compose方法
function compose (middleware) {
  // ...
  return function (context, next) {
    // last called middleware #
    let index = -1
    // 一开始的时候传入为 0,后续会递增
    return dispatch(0)
    function dispatch (i) {
      // 假如没有递增,则说明执行了多次
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      index = i
      // 拿到当前的中间件
      let fn = middleware[i]
      if (i === middleware.length) fn = next
      // 当 fn 为空的时候,就会开始执行 next() 后面部分的代码
      if (!fn) return Promise.resolve()
      try {
        // 执行中间件,留意这两个参数,都是中间件的传参,第一个是上下文,第二个是 next 函数
        // 也就是说执行 next 的时候也就是调用 dispatch 函数的时候
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}

为什么需要洋葱模型?

参考文献

【Node】深入浅出 Koa 的洋葱模型

举报

相关推荐

0 条评论