You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioncompose(middleware){if(!Array.isArray(middleware))thrownewTypeError('Middleware stack must be an array!')for(constfnofmiddleware){if(typeoffn!=='function')thrownewTypeError('Middleware must be composed of functions!')}/** * @param {Object} context * @return {Promise} * @api public */returnfunction(context,next){// last called middleware #letindex=-1returndispatch(0)functiondispatch(i){if(i<=index)returnPromise.reject(newError('next() called multiple times'))index=iletfn=middleware[i]if(i===middleware.length)fn=nextif(!fn)returnPromise.resolve()try{returnPromise.resolve(fn(context,dispatch.bind(null,i+1)));}catch(err){returnPromise.reject(err)}}}}
koa源码分析
koa的源码很简单,我们来分析一下。
主要下面的两点:
请求如何流转
看node文档我们知道
http.createServer(this.callback())
这行代码,this.callback()
每次有请求都会促发。并且每次请求都会经过所有的中间件,每个中间件函数就可以对ctx为所欲为,而且ctx上还挂载着原生的req和res,这样就更灵活了。
中间件的处理
this.middleware = [];
const fn = compose(this.middleware);
重点看下
compose
的代码首先
middleware
是数组,里面放着一个个的函数,调用compose并运行时,实际返回一个promise(所以支持async await),每个中间件的函数中传入了context和下一个运行的函数,在中间件中调用next就可以执行下一个中间件函数。(算是koa的核心代码吧,NBNB)内部context代理
ctx之所以可以访问 包装对象 response 和 request 的原因
我们看看 delegate 的源码
原理很简单就是 利用
__defineSetter__
和__defineGetter__
。嘿嘿,这样你就可以在ctx使用包装的 response 和 request,还有原生node的req、res啦错误处理
官方文档
默认情况下,将所有错误输出到 stderr,除非 app.silent 为 true。 当 err.status 是 404 或 err.expose 是 true 时默认错误处理程序也不会输出错误。 要执行自定义错误处理逻辑,如集中式日志记录,您可以添加一个 “error” 事件侦听器
好了剩下的就是response,request类了,这两个很简单,就是封装了一些原生不好用的方法。
The text was updated successfully, but these errors were encountered: