洋葱模型,中间件嵌套
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