精华内容
下载资源
问答
  • 图1 demokoa内部文件组成图2 Koa代码文件图3 文件和具体类application.js中包含了Application类和一些辅助方法context.js主要作用是承载上下信息,并封装了处理上下文信息操作request.js中封装了处理请...

    目标

    本文主要通过一个简单的例子来解释koa的内部原理。

    koa的一个简单例子

    图1是Koa的一个简单例子,下文会对这个例子的每行代码背后的逻辑做详细分析。

    5d4f089bd14e9c91edf50a2da12ee120.png

    图1 demo

    koa内部文件组成

    ed626b861977d156f3ecc432989ffa17.png

    图2 Koa代码文件

    1ce5e26e97734e086b715a953067ffa8.png

    图3 文件和具体类

    • application.js中包含了Application类和一些辅助方法
    • context.js主要作用是承载上下信息,并封装了处理上下文信息的操作
    • request.js中封装了处理请求信息的基本操作
    • response.js中封装了处理响应信息的基本操作

    koa内部

    在图1的例子中,执行const app = new koa()时,实际上构造了一个Application实例,图4为Application构造方法,构造方法中创建了Context、Request、Response等类的运行实例。关于Context、Response、Request类及方法介绍请参考

    https://koajs.com/

    下文约定request代指Request类实例,response代指Response类实例,context代指Context类实例。

    46fdc45172a6a8be0154c2daab548a26.png

    图4 Application构造方法

    图1的例子中调用app.listen(3000)方法监听3000端口进来的http请求,listen方法内部创建了一个http.Server对象,并调用http.Server的listen方法。具体代码如图5

    cbeb669fc879b6c832de807448572e65.png

    图5 listen犯法

    图5this.callback方法的源码如下图6中所示

    eae69249e1b77cf7cf36541f6ed137dc.png

    图6 callback

    callback方法返回一个handleRequest函数,作为createServer的参数,当http.Server实例接收到一个http请求时,会将请求信息和请求响应对象传给handleRequest函数,具体指将http.IncomingMessage的实例req,和http.ServerResponse的实例res传给handleRequest函数。其中this.createContext函数的源码如下图7

    http.IncomingMessage和http.ServerResponse信息可以参照node.js官网

    aa48207892e2c1b931e1be575714f953.png

    图7 createContext

    图7中createContext的主要作用是将请求信息和响应信息封装在Request和Response类的运行实例中,并创建上下文类Context实例。context对象包含了Application、Request、Response等实例的引用。在this.callback方法中还有另一行很重要的代码,如下代码片段1

    代码片段1

    const fn = compose(this.middleware);

    可以从图4中Application的构造方法中知道this.middleware是一个数组,该数组用来存储app.use方法传入的中间件函数。Application的use方法具体代码实现细节如图8,其中最关键的一行代码是this.middleware.push(fn)。

    a44e83d2867dd0cc26fd214f0a88eed1.png

    图8 use

    compose方法的代码实现包含在koa-compose包中,具体代码实现细节如图9

    78f42b5b1b3513d37ea78c86768aba02.png

    图9 compose

    compose方法接收this.middleware数组,返回一个匿名函数,该函数接收两个参数,上下文实例context和一个next函数,执行该匿名函数会执行this.middleware数组中的所有中间件函数,然后在执行传入的next函数。匿名函数调用是在Application的callback方法中,在图6的callback方法的最后将执行上下文对象和compose方法返回的匿名函数作为参数传入this.handleRequest方法。接下来看一下this.handleRequest方法的具体细节,如图9

    65e30d4b7b69b0da587ca3245aa85f22.png

    图9 handleRequest

    在this.handleRequest方法中创建了错误处理方法onError和返回响应的方法handleResponse。fnMiddleware就是compose方法返回的匿名函数。在this.handleRequest方法的最后执行匿名函数,并传入hanldeResponse和onError函数分别处理正常请求响应流程和异常情况。

    return fnMiddleware(ctx).then(handleResponse).catch(onerror);

    执行fnMiddleware函数,实际上是执行之前传入所有中间件函数。在中间函数中可以拿到上下文对象的引用,通过上下文对象我们可以获取到经过封装的请求和响应实例,具体形式如图10

    c84bd9e9df03ad8af4f2920b72f513ec.png

    图10 中间间函数例子

    在中间件方法中可以设置响应头信息、响应内容。以及读取数据库,获取html模版等。将需要返回给用户端的数据赋值给上下文对象context的body属性。respond方法的具体实现如图11

    8ec179cff81e17f1b6a00b4cf5ec3a9b.png

    图11 respond

    respond方法的主要作用是对返回的内容进行一些处理,然后调用node.js的http.ServerResponse实例的end方法,将具体内容返回给用户端。

    request.js和response.js

    ApplicationcreateContext方法中,将node.js的请求(http.IncomingMessage)和响应对象(http.ServerResponse)分别赋值给了Request类和Response类实例对象。Request中主要包含了处理请求的方法(实际上都是get方法,或者获取器),获取请求数据,例子如图12

    dc86d615ad51a33106af70d733aca5df.png

    图12 host方法例子

    上面的代码中this.reqhttp.IncomingMessage实例,包含了http请求信息。Response中包含了处理请求响应的操作。例如设置响应状态信息,如图13

    4b06bbc90c97dfd7e762e4b254a51f8c.png

    图13 status

    其中this.reshttp.ServerResponse对象实例。

    到此处,图1中三行代码的背后逻辑已分析完成。

    展开全文
  • 它使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来,而使用表现层框架则可以将Jsp中剩余JavaBeans完全分离,这部分JavaBeans主要负责显示相关信息,一般是通过标签库(Taglib)实现,不同框架有不同自己...
  • VB程序设计及应用

    2012-11-26 14:07:12
    中文名: VB程序设计及应用 ...17.2.1 画板系统的主要功能 17.2.2 画板系统的程序设计 17.3 学生档案管理系统的设计 17.3.1 系统结构图 17.3.2 数据库的建立 17.3.3 主窗体的设计 实训 参考文献
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET第一语言 本书着重介绍语言本身,比较少涉及应用,不错入门书,从头讲起,不怕... C#语言在.NET 框架的作用及其特性 1.1 Microsoft.NET 一场新革命 1.1.1 什么是.NET 2000 年 6 月 ...
  • ASP.NET网页代码模型及生命周期

    热门讨论 2009-07-28 14:22:11
    图4-7 页面框架的事件驱动处理模型 上图则说明了当一个浏览者通过浏览器触发ASPX页面时,浏览器、服务器和服务器返回页的过程。 4.4 ASP.NET客户端状态 Web开发不像软件开发,Web应用实际上是没有状态的,这就说明...
  • C#微软培训资料

    2014-01-22 14:10:17
    C#语言在.NET 框架的作用及其特性 1.1 Microsoft.NET 一场新革命 1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念一天 这一天 微软公司正式推出...
  • ASP.NET精品课程+源代码

    千次下载 热门讨论 2009-01-05 20:15:51
    我们在实训课题引入前提下,通过一系列完整案例分析来帮助学生学会ASP.NET知识,使学生由浅入深逐步掌握ASP.NET主要技术领域以及分布式应用程序开发,提高解决实际问题能力。并为学生终生学习做了良好铺垫...
  • 它是 VC一个扩充游戏开发包,主要用于游戏设计时直接操作硬件设备,进而加快游戏运行速度。本书中将使用GAF开发包来进行设计。GAF开发包是由“第二人生”开发,对DirectX包装后类库;它把游戏设计中经常用到...
  • Java development with ant

    2008-03-28 12:34:36
    他们项目是同时使用Java和VB/ASP建立一个用于图像处理web services,这个项目完成期限非常紧张。从一开始,就借鉴了前一年所有经验,不仅用在了service架构和实现上,还用在了如何使用Ant管理构建过程方面。...
  • asp.net知识库

    2015-06-18 08:45:45
    ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net ...
  • c#学习笔记.txt

    2008-12-15 14:01:21
    c#学习笔记(1) ...(Microsoft后来在完全面向.NET框架的开发语言集中加入了Visual J#.NET,算是对Java语言用户的一种照顾。) 有人说,选择C#意味着选择MS(在中国的程序员当中,这并不是件值得自豪的事...
  • 但是其实国内的软件行业正是缺乏一大批对于自己的工作精益求精的软件工匠,这才是国内软件行业的主要问题所在。 相比之下,日本人是一个非常有匠人气质的民族。手艺精湛的匠人自古以来在日本都受到普遍的尊重。...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • 打冰雹游戏源程序

    2013-06-16 00:07:04
    本次课程设计利用《软件设计基础-VB》课程中所学到编程知识和编程技巧,完成具有一定难度和工作量程序设计题目,帮助学生掌握编程、调试基本技能,独立完成所布置任务。 要求: 1、对系统进行功能需求分析 2...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • 尽管3s具有重要地位与作用,但应用不尽人意,主要是缺乏熟练、跨学科高级操作应用人才;缺乏熟悉3s与地图学开发人才;缺乏熟练、经验丰富3S人才。熟练、经验丰富开发人才,举办3S与Google Earth最新...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • MYSQL中文手册

    2013-03-11 21:21:34
    1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可...
  • MySQL 5.1参考手册.chm

    2011-12-07 13:53:37
    1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • MySQL 5.1参考手册

    2010-04-20 22:02:50
    1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

vb框架的主要作用