资讯专栏INFORMATION COLUMN

koa源码解析

hsluoyz / 2204人阅读

摘要:用法回顾执行顺序每当执行时,执行下一个中间件,执行到最后一个中间件后开始往回执行源码解析源码执行步骤使用方法即将进中的数组中方法调用的和方法来创建服务,的回掉执行下面的操作回掉首先执行方法将组合成一个对象来执行,这个对象即可完成中

用法回顾
const Koa = require("koa");
const app = new Koa();

app.use(async (ctx, next) => {
  fn1();
  await next();
  fn2();
});

app.use(async (ctx, next) => {
  fn3();
  await next();
  fn4()
});

app.use(async (ctx, next) => {
  fn5();
  await next();
  fn6()
});

app.listen(3000);

执行顺序 fn1 -> fn3 -> fn5 -> fn6 -> fn4 -> fn2
每当执行next时,执行下一个中间件,执行到最后一个中间件后开始往回执行

源码解析 源码执行步骤

使用use方法即将middleware push 进koa中的this.middleware数组中

listen方法调用node的http.createServer和server.listen方法来创建服务,createServer的回掉执行下面的操作

回掉首先执行compose(this.middleware)方法将middleware组合成一个promise对象来执行,这个promise对象即可完成中间件级联的操作

将回掉传出的值req和res用于创建一个context对象,里面包含了request对象和response对象,这些对象提供了许多后台开发需要的参数和方法

执行中间件

得到结果给respond方法格式化数据

或者捕获异常给onerror方法处理异常

compose

koa源码最重要的部分,如何实现中间件级联,以下是compose方法的源码(为方便观看,部分进行了ES6处理)

function compose (middleware) {
  if (!Array.isArray(middleware)) throw new TypeError("Middleware stack must be an array!")
  for (const fn of middleware) {
    if (typeof fn !== "function") throw new TypeError("Middleware must be composed of functions!")
  }

  return function (context, next) {
    // last called middleware #
    let index = -1
    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 // next = undefined
      if (!fn) return Promise.resolve() // 当运行到最后一个middleware时结束
      try {
        return Promise.resolve(
          fn(context, next = () => dispatch(i + 1))
        )
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}

compose方法使用递归的方式遍历每一个middleware

遍历时将下一个middleware当作next传递给当前的middleware

更多文章 yjy5264.github.io

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94172.html

相关文章

  • Koa 系列 —— Koa 中间件机制解析

    摘要:中异步处理在中使用的是,在中使用的是,我们本次采用来处理异步。函数参数为的数组,数组成员是通过方法添加的中间件。小结从最开始的编写中间件,到现在阅读函数源码,中间件机制并不复杂,了解之后,我们可以运用编写更合适的中间件,构建自己的应用。 上一篇讲了如何编写属于自己的 Koa 中间件,本篇将根据原理实现一个简单的中间件处理函数,并对 Koa 中间件处理函数 compose 函数进行源码解...

    blastz 评论0 收藏0
  • Koa源码解析

    摘要:若大于时,将赋予,此时与相等。通过源码分析,我们知道了的核心思想建立于中间件机制,它是一个设计十分简洁巧妙的框架,扩展性极强,就是建立于之上的上层框架。 Koa是一款设计优雅的轻量级Node.js框架,它主要提供了一套巧妙的中间件机制与简练的API封装,因此源码阅读起来也十分轻松,不论你从事前端或是后端研发,相信都会有所收获。 目录结构 首先将源码下载到本地,可以看到Koa的源码只包含...

    CarterLi 评论0 收藏0
  • KOA2框架原理解析和实现

    摘要:实现的四大模块上文简述了源码的大体框架结构,接下来我们来实现一个的框架,笔者认为理解和实现一个框架需要实现四个大模块,分别是封装创建类构造函数构造对象中间件机制和剥洋葱模型的实现错误捕获和错误处理下面我们就逐一分析和实现。 什么是koa框架?        koa是一个基于node实现的一个新的web框架,它是由express框架的原班人马打造的。它的特点是优雅、简洁、表达力强、自由度...

    tracymac7 评论0 收藏0
  • KOA2框架原理解析和实现

    摘要:实现的四大模块上文简述了源码的大体框架结构,接下来我们来实现一个的框架,笔者认为理解和实现一个框架需要实现四个大模块,分别是封装创建类构造函数构造对象中间件机制和剥洋葱模型的实现错误捕获和错误处理下面我们就逐一分析和实现。 什么是koa框架?        koa是一个基于node实现的一个新的web框架,它是由express框架的原班人马打造的。它的特点是优雅、简洁、表达力强、自由度...

    liangzai_cool 评论0 收藏0

发表评论

0条评论

hsluoyz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<