KOA认为每个人都有或多或少的联系。即使没有使用KOA的人,也肯定会听到洋葱模型的概念。TODAY的目标是用手为您带来KOA2。
前两章的想法是从使用级别和操作结果中推出源代码。我觉得替换感将更强。最后一章根据官方文档和源代码完全实施。
旧规则,首先问几个问题
接下来,我们将在实施过程中逐一解决这些问题!
首先观察KOA的最简单演示
首先观察代码结构
结合上述两个结论,可以推断出KOA中的结构可能是这样
然后查看运行结果
app.listen(8889,'0.0.0.0',()=> {console.log()})// node koa.js->启动成功8889 // Postman request-> 1
然后查看运行结果
因此,与上述结论相结合,我们可以实现刚刚编写的最简单的演示。代码如下
核实
多个中间件中最简单的演示的源代码已经完成,但是当您编写KOA时,将会有很多插头,自定义的拦截器,例如各种拦截器。但是就这些中间件的特定逻辑而言,他们执行顺序不过是两种类型的同步和异步。因此,区分这两种情况,观察代码结构并运行结果,然后逐步进行分析,最后得出源代码。
同步
观察上述代码结构和操作结果(这次需要与操作结果结合进行分析,因此不会拆分)
首先,根据1和2结论,可以获得以下代码
第三点更加复杂。为了更好地分析,我们可以在JS中编写使用守则。
整个部分都是暂时的,无论CTX如何
结合JS代码和上图,我们如何打包此使用功能?
唯一的困难是如何获得下一个中间件。这次,我们考虑了中间件注册的时机。当中间软件注册在节点服务启动时发生时,执行是在请求进来时,因此当请求进来时,我们已经使用数组来保存所有中间部分,那么我们是我们,我们是您可以使用设置阵列以获取下一个中间件
使用上述概念实现最简单的洋葱,以查看是否可以像KOA一样运行
核实
验证基于上述实施,有2点需要注意
之前还提到过,当服务器启动时,所有中间件都已收集,因此,要使代码更强,最好在启动阶段进行强制性验证。LET的分析如何执行此操作。
基于上述2分,可以得出。回调执行后,立即执行组合,并在请求时执行中间软件功能
查看
了解更多关于KOA边境的人可能会发现我们目前实施的代码有两个尚未处理的边界
首先查看第一个边界,如图所示。尽管发出了警告,但日志为3和1。第一个下一个正常执行,它不会影响下一步的后续逻辑的运行。那么,我们如何判断代码中有不止一个?查看核心代码的核心代码构成
每个接下来是一个调度(i + 1),这意味着每次执行下次执行时我是相同的。再次执行调度时,比索引或等于索引。
那么第二个边界很容易处理。下一个下一个接下来的下一个,只需默认返回一个空功能
然后验证整体验证
报告错误的时间是因为基础包装不同并且不会影响它。
在上一步中实现的代码的异步使用尝试尝试异步的运行结果
这里很困惑吗?它与KOA源代码的操作一致。包装完成了吗?
答案肯定是否!因为日志是正确的,因为异步的基本实现等待。一个词,底层原理是基于承诺的自执行的生成器函数。异步最终将回报诺言,等待等于产量。因此,请勿使用异步等待,直接使用承诺的结构观看演示
从上面的演示中可以看出,最后一个中间部分是正常函数,但是先前的中间件使用next()。然后(),也就是说,最后一部分是一个承诺。这确实是在KOA中允许的,也没有错误,也就是说,KOA与普通功能兼容和承诺。那么您如何兼容?
承诺
让我们看一下Promise.resolve的源代码
因此,再次修改组合功能
刚刚验证演示,正常日志1 2 3,然后再次查看另一种情况
通过报告错误,您可以看到2个未登录,即中间件中间部分的最后一件中间件。然后,如果您考虑上一个保护机制中的第二个边界的处理,请返回承诺。溶解直接解决解决方案以解决解决方案的问题
终于完成错误情况的兼容性
基础架构的一章直接基于文档以实现其原则。不再遵循以前的推论思想。首先,在包装之前,让我们看一下CTX的官方定义。简而言之,节点的响应和请求被封装。本部分仅封装了CTX,请求,响应和主体。
然后在上述上下文的描述中,每个请求都会创建一个新的上下文并在中间件中引用它,这意味着服务器每次接收请求时(在回调中返回的功能),它们将基于REQ和RES基于REQ和RES。req and res)。创建上下文。文档在文档中描述了上下文中的内容。
中间部分的第一个参数是基于上述描述的上下文,该描述可以按以下方式得出源代码(您只能查看注释部分)
日志的CTX可能是以下结构
响应和请求已分配了请求和响应的价值,因此您可以为Req和Res制作有用的软件包
核实
CTX别名可以看到官方文件具体的内容。在这里,您可以为请求的标题和URL执行此操作。其他是相同的。源代码用于使用代表制作代理层。实际上,您也可以使用代理等来实现请求的声誉
核实
在CTX.Body KOA为CTX.Body分配值之后,CTX的类型将在请求结束时识别,然后返回相应的数据
因此,当我们只需要完成所有中间件时,判断身体类型,然后使用res.nd结束请求。源代码的粗略版本如下
参考文章https://juejin.cn/post/702226279048347679Https://juejin.cn/post/7016587795510607879
原始:https://juejin.cn/post/7096282667825496100