koa中间件原理

讲一讲koa2中简单的发布订阅,以及next异步等待

const http = require('http')
let list = []
let ctx = {}
class Koa {
  use (fn) {
    list.push(fn) //添加订阅者,即每个use()当中的函数订阅了next
  }
  listen () {
    http.createServer((req, res) => {
      const ctx = this.createContext(req, res)  //创建上下文(源码当中的上下文指向没这么简单)
      const fn = this.middleware(ctx)  //中间件原理
      fn.then(() => {
        res.end(ctx.body)
      })
    }).listen(...arguments)
  }
  middleware (ctx) {
    function dispatch(index) {
        if(index === list.length) return
        let match = list[index]
        return Promise.resolve(match(ctx, async () => {
          return dispatch(++index) //当next执行后继续发布,直到index === list.length
        }))
    }
    return dispatch(0) //添加发布者dispatch,必须返回promise,以实现洋葱圈模型
  }
  createContext (req, res) {
    ctx.request = ctx.req = req
    ctx.response = ctx.res = res
    return ctx
  } 
}
module.exports = Koa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值