美文网首页
koa 2.0 中间件部分代码注释

koa 2.0 中间件部分代码注释

作者: 嘿__老刘 | 来源:发表于2017-11-01 20:08 被阅读0次
'use strict'

/**
 * Expose compositor.
 */

module.exports = compose

/**
 * Compose `middleware` returning
 * a fully valid middleware comprised
 * of all those which are passed.
 *
 * @param {Array} middleware
 * @return {Function}
 * @api public
 */
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!')
  }

  /**
   * @param {Object} context
   * @return {Promise}
   * @api public
   */
  //context 与 next 由http.createServer 为其传入  返回的匿名函数为传入到createserver中
  return function (context, next) {
    // last called middleware #
    let index = -1
    return dispatch(0)
    function dispatch (i) {
      //index =》 计数器
      //i     =》 中间件数组的索引
      //保证不会执行到undefined
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      //更改计数器的值
      index = i
      //将middleware的i元素赋值给 fn
      // 我感觉是1、为了以后写着方便
      // 2、 middleware[i]每次都会执行数组查找元素的操作
      // fn应该拿到的是地址
      let fn = middleware[i]
      // 如果没有函数了,则直接执行next结束中间件调用链
      if (i === middleware.length) fn = next
      //如果fn不存在则直接空函数
      if (!fn) return Promise.resolve()
      //用try catch 包裹 防止异常情况阻塞服务运行
      //为什么只在此处用try catch包裹
      //1、try catch 过多会影响代码的运行效率
      //2、前半部分代码,基本上不会出现不可预料的错误,并且异常处理已做
      //3、此处运行外部嵌入的函数,不可预知是否会出现异常未被处理的情况
      try {
        //返回
        //此处解释了为什么在中间件代码中 await next 会将执行权限交给下一个中间件
        //1、此处的function next 也就是中间件中的next
        //2、 await next 也就是等待此处dispatch执行完毕,也就是将执行权限交给下一个中间件
        return Promise.resolve(fn(context, function next () {
          return dispatch(i + 1)
        }))
      } catch (err) {
        //返回错误promise
        return Promise.reject(err)
      }
    }
  }
}

相关文章

  • koa 2.0 中间件部分代码注释

  • koa-session学习笔记

    koa-session是koa的session管理中间件,最近在写登录注册模块的时候学习了一下这部分的代码,感觉还...

  • Koa中间件(middleware)级联原理

    前言 上次看到了koa-compose的代码,今天来说一下koa中间件的级联以及工作原理。 中间件工作原理 初始化...

  • koa系列(三)

    文章内容:koa 中间件 以及 koa 中间件的执行流程。 一、什么是 Koa 的中间件 中间件就是匹配路由之前或...

  • 知识点总结

    Koa2中间件 koa(面向node.js的表达式HTTP中间件框架)、koa-router(路由中间件)、koa...

  • Koa学习笔记

    中间件 Koa 的最大特色,也是最重要的一个设计,就是中间件(middleware) 中间件的概念 代码中的log...

  • 8KOA 静态文件

    静态文件 使用 koa-static 中间件实现静态文件访问 安装中间件 使用中间件 使用 koa-mount 自...

  • koa

    koa 学习 中间件 koa-router koa-router 获取get/post请求参数 koa-bodyp...

  • Koa2学习系列02-中间件用法——讲解 Koa2 中间件的用法

    middleware 中间件 正是因为中间件的扩展性才使得 Koa 的代码简单灵活。 在 app.js 中,有这样...

  • koa2中间件原理

    koa2中间件的执行 koa2中间件的执行就像洋葱圈一样,从外面到最里面,再从最里面到最外面。 执行上述代码的结果...

网友评论

      本文标题:koa 2.0 中间件部分代码注释

      本文链接:https://www.haomeiwen.com/subject/gtzgpxtx.html