Koa 解析( 三 )
在这里主要是明确 context 挂载的内容 , 这个 context 是 每一次请求都会生成 的 。 由代码可知:
- 每个应用实例 app 都会有对应的 context 、 request 、 response 实例(即 this.xxx ) 。 每个请求 , 都会基于这些实例来创建自己的实例 。 这样做的目的是为了不污染全局的变量 。
- 将 node 原生的 req 、 res 以及 this 挂载到 context 、 request 、 response 上 。
- 将创建的 context 返回 , 传入所有中间件的第一个参数 , 作为这个请求的上下文 。
koa-compose 实现洋葱圈模型接下来 , 我们来看看源代码中的 koa-compose 插件是如何实现洋葱圈模型:
function compose (middleware) {// 类型检查if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')for (const fn of middleware) {if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')}return function (context, next) {// 上一次被执行的中间件let index = -1return dispatch(0)function dispatch (i /*表示预期想要执行哪个中间件*/) {if (i <= index) return Promise.reject(new Error('next() called multiple times'))index = ilet fn = middleware[i]if (i === middleware.length) fn = next// 没有fn的话 , 直接返回一个已经reolved的Promise对象if (!fn) return Promise.resolve()try {/*原代码是一行 , 为了方便理解拆成了三行const next = dispatch.bind(null, i + 1);const fnResult = fn(context, next);return Promise.resolve(fnResult);*/return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));} catch (err) {return Promise.reject(err)}}}}简单来看 , 在 compose 中会根据变量 i 挨个执行中间件 , 以递归的方式来执行 。整个过程不难理解 , 实现较为巧妙 。值得注意的是:每一次 dispatch() 的返回值都是 Promise。 可参考下面的动图来过一遍上面代码的实现 。
文章插图解析 handleRequest我们来看看 , 得到了每个请求的上下文信息 context 与 经过 compose 后的中间件逻辑之后 , 我们来看看最终如何处理请求的:
handleRequest(ctx, fnMiddleware) {const res = ctx.res;res.statusCode = 404;const onerror = err => ctx.onerror(err);const handleResponse = () => respond(ctx);onFinished(res, onerror);// 执行 compose 后的中间件函数 , 最后执行 respondreturn fnMiddleware(ctx).then(handleResponse).catch(onerror);}执行 compose 后的中间件函数 , 最后执行 respond 方法 。 经查看 , 可以知道 , 主要是对响应进行封装 , 并且赋值给到 context.res.end(body)。总结综上 , 我们简单地对 Koa 进行了介绍;同时通过解析 Demo 文件的执行过程 , 我们从源码级别窥见了 Koa 的一些相关原理实现 。 至此 , 我们就已经将 Koa 相关的介绍与解析讲完了 。 我在写下来本文章的过程中 , 会对整个过程更加理解 , 也希望对你有所帮助!
推荐阅读
- 国家工业互联网标识解析二级节点(威海)上线
- 多就是好吗?解析智能手机多摄发展困局
- 新基建下,系统集成商数字化建设及渠道管理深度解析
- 四个维度解析区域发展与治理
- 智媒视角看深圳用数据解析城市
- “联邦的战斗力量”再现,华硕Z490主板机动战士高达版解析
- 天翼云全国首个工业互联网平台二级解析节点上线
- 在美国当快递小哥赚钱吗?西瓜视频解析除了努力,运气也很重要
- 蚂蚁庄园月有阴晴圆缺答案解析 12月18日今天支付宝蚂蚁庄园答案大全
- 如何做到性能翻倍 NVIDIA Ampere架构解析
