简单模拟koa2原理

洋葱模型,中间件嵌套

const http = require('http')

function composeMid(middWareArr){
  return (ctx)=>{
    function dispatch(i){
      let fn = middWareArr[i]
      try{
        return Promise.resolve(
          fn(ctx,dispatch.bind(null,i+1))
        )//koa2的每一个中间件都是promise对象,asnyc await同步写法可以看出
      }catch(err){
        return Promise.reject(err)
      }
    }
    
    return dispatch(0)
  } 
  //中间件传递,
 
}


class koa{
  constructor(){
    this.middWareArr = []//存储中间件
  }

  use(fn){
    this.middWareArr.push(fn)//app.use()注册中间件
    return this //中间件app.use方法可以链式调用
  }

  getCxt(req,res){
    let cxt  = {
      req,
      res
    }
    cxt.query = req.query
//简单模拟了一种属性
    return cxt//cxt对象包含了req,res对象


  }

  callback(){
    let fn = composeMid(this.middWareArr)
    return (req,res)=>{
      const ctx = this.getCxt(req,res)
       return fn(ctx)
    }
  }

  listen(...arg){
    let server = http.createServer(this.callback())
    server.listen(...arg)
  }

}


module.exports = koa

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值