当前位置: 首页 > 后端技术 > Node.js

koa源码分析_0

时间:2023-04-03 17:46:36 Node.js

使用回顾constKoa=require('koa');constapp=newKoa();app.use(async(ctx,next)=>{fn1();awaitnext();fn2();});app.use(async(ctx,next)=>{fn3();awaitnext();fn4()});app.use(async(ctx,next)=>{fn5();awaitnext();fn6()});app.listen(3000);执行顺序fn1->fn3->fn5->fn6->fn4->fn2每当执行next时,执行下一个中间件,从最后一个中间件开始执行回去执行源码解析源码执行步骤使用use方法将中间件压入koa中的this.middleware数组中。listen方法调用node的http.createServer和server.listen方法创建服务,createServer的返回执行以下操作返回首先执行compose(this.middleware)方法将中间件组合成一个promise对象用于执行。这个promise对象可以完成中间件的级联操作,返回传出值req和res创建一个context对象,其中包含了request对象和response对象的提供。这些对象提供了很多后台开发需要的参数和方法。执行中间件得到结果,格式化数据给respond方法,或者捕获异常给onerror方法处理异常。composekoa源码最重要的部分,如何实现中间件层链接,下面是compose方法的源码(为了方便查看,已经进行了一些ES6处理)functioncompose(middleware){if(!Array.isArray(middleware))thrownewTypeError('Middlewarestackmustbeanarray!')for(constfnofmiddleware){if(typeoffn!=='function')thrownewTypeError('中间件必须由函数组成!')}returnfunction(context,next){//最后调用的中间件#letindex=-1returndispatch(0)functiondispatch(i){if(i<=index)returnPromise.reject(newError('next()被多次调用'))index=iletfn=middleware[i]if(i===middleware.length)fn=next//next=undefinedif(!fn)returnPromise.resolve()//运行到最后一个中间件时结束try{returnPromise.resolve(fn(context,next=()=>dispatch(i+1)))}catch(err){returnPromise.reject(err)}}}}compose方法递归遍历每一个中间件,遍历时将下一个中间件作为当前中间件的next传递更多文章yjy5264.github.io