koa2源码函数概述

application.js

Application

  • constructor
    • this.proxy = false;
    • this.middleware = [];
      
    • this.subdomainOffset = 2;
      
    • this.env = process.env.NODE_ENV || 'development';
      
    • this.context = Object.create(context);
      
    • this.request = Object.create(request);
      
    • this.response = Object.create(response);
      
  • listen
    • 接收参数,并使用Application的callback函数创建node.js服务器.args作为server.listen的实参.
  • toJSON
    • 将第二个参数的值添加到第一个参数的键位中
  • inspect
    • 检查接口
  • use
    • 接收一个函数,并检查他是否有废弃的方法,通过检测就将其压入middleware数组中
  • callback
    • dispatch函数介绍
      • compose会把中间件数组放入dispatch函数中并返回dispatch函数.该函数每次执行都会把index加1,并以该索引作为中间件数组的索引,当index与中间件数组长度一致时,则会将next函数作为fn来执行.当大于中间件数组长度时,fn则会是undefined并触发空的resolve函数
    • fn,执行fn(context,next)函数后会获得dispatch函数.
    • handleRequest,接收req和res参数,使用Application的createContext(req,res)函数创建ctx,并返回Application的handleRequest(ctx,fn)的返回值.
  • handleRequest
    • 内部的handleResponse函数会调用父级作用域的respond函数
  • createContext
    • 初始化ctx
  • onerror
    • 用以生成错误信息

respond

  • 一个辅助函数,他会使用res.end来关闭与传输数据,如果有数据的话.

context.js

inspect

  • 会调用context的toJSON方法

toJSON

  • 他会调用request,response和app的toJSON方法

assert

  • httpAssert
    • 断言检查,生成错误信息

throw

  • 接收参数并以此生成错误信息

onerror

  • 接收error对象,触发error事件,并生成HTTP错误码.最后会使用res.end传输信息并终止http连接.

cookies

  • get
    • 有cookie则返回,没有则创建cookie对象后再返回
  • set
    • 将接收的数据放入this[COOKIES]中

delegate

  • delegate是一个构造函数
    • 接收一个proto原型对象和一个字符串
  • method
    • 接收一个name字符串并把它压入methods数组中.之后再用用target与name往实例上添加一个方法.
  • access
    • 接收一个name字符串,先用他生成指定的getter,然后再用生成指定的setter并返回this.
  • getter
    • 接收一个name字符串,并把它压入getters数组中.并改写getter.返回this.
  • setter
    • 接收一个name字符串,并改写setter.返回this.
  • fluent
    • 接收一个name字符串,并压入fluents数组中.然后会在指定target的name属性下,赋值一个函数.该函数会将接收到的参数覆盖他自己.

request.js

header

  • set
    • 接受一个参数并赋值给this.req.headers
  • get
    • 获取this.req.headers

headers

  • 它是header的别名,功能完全一样

url

  • set
    • 接收一个参数并设置this.req.url
  • get
    • 获取this.req.url

origin

  • get
    • 拼接this.protocol与host并返回.

href

  • get
    • /^https?:///i
      • 这个正则等价于http(s){0,1}//.即匹配http://或https://.
    • 如果匹配正则,那么直接返回originalUrl,否则会将origin与originalUrl拼接后再返回.

method

  • get
    • 接收一个参数并赋值给this.req.method
  • set
    • 获取this.req.method

path

  • set
    • 接收一个path字符串,如果该参数与已有的pathname一直,则返回void.反正就将其赋值给url的pathname,并在序列化url之后覆盖之前的url
  • get
    • 函数内的parse函数会获取url的search,query,pathname等属性.这里只会返回pathname属性.

query

  • set
    • 接收一个obj对象,并在序列化后赋值给this.querystring
  • get
    • 获取查询字符串

querystring

  • set
    • 接收一个str字符串,并让parse解析并赋值给url.然后判断str是否为搜索字符串,如果是则返回void.否则在用序列化后的url覆盖之前的url.
  • get
    • this.req为false就返回空字符串.否则返回通过parse解析后的query字符串.如果解析失败则返回空字符串.

search

  • set
    • 接收字符串并赋值给this.querystring
  • get
    • 如果this.querysearch不为false,那么返回this.querysearch

host

  • get
    • 如果是通过代理访问则通过header的X-Forwarded-Host属性来获取主机原始地址.否则直接获取header.host属性获取主机地址.

hostname

  • get
    • this.host由域名与端口拼接而成,这里返回':'分隔符的前半段.

URL

  • get
    • 使用protocol,host与originalUrl合成一个url,并赋值给memoizedURL,然后返回.

fresh

  • get
    • 首先检查this.method是否是GET或HEAD,都不是返回false.然后检测this.ctx.status是否是200至300之间与304的状态,如果是则返回fresh(this.header, this.response.header)的结果,否则返回false.
    • fresh
      • 返回布尔值

stale

  • get
    • 返回this.fresh的非

idempotent

  • get
    • 检索this.method中是否有['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']这些方法.有返回true否则返回false.

socket

  • get
    • 返回this.req.socket

charset

  • get
    • 获取header的Content-Type属性的值,如果该值为false则返回空字符串.否则将其作为contentType.parse函数的参数.最后返回type.parameters.charset || ''.

length

  • get
    • 返回header的Content-Length属性

protocol

  • get
    • 返回网络协议的字符串

secure

  • get
    • 确认协议是否是https

ips

  • get
    • 会将诸如"client, proxy1, proxy2"处理成["client, proxy1, proxy2"]

ip

  • set
    • 将参数_ip赋值给this.[IP]
  • get
    • 检查this[IP]是否存在,不存在则按照this.ips[0] || this.socket.remoteAddress || ''顺序来对this[IP]赋值.最后都会返回this[IP]

subdomains

  • get
    • 返回子域名构成的数组,如果是this.hostname是ip则返回空数组

accept

  • set
    • 传递一个obj对象并赋值给this._accept
  • get
    • 返回accept对象

accepts

  • 接收参数,并将其作为this.accept.types的参数,最后返回结果.

acceptsEncodings

  • 接收参数,并作为this.accept.encodings的参数

acceptsCharsets

  • 接受参数并作为this.accept.charsets函数的参数

acceptsLanguages

  • 接受参数并作为this.accept.languages函数的参数

is

type

  • get

get

  • 接收一个field字符串,然后返回this.req.headers[field],如果该属性不存在则返回空字符串.如果field为'referer'或'referrer'则返回req.headers.referrer||req.headers.referer||''

inspect

  • 返回this.toJSON的返回值

toJSON

  • 将第二个参数的值添加到第一个参数的键位中

response.js

socket

  • get
    • 返回this.res.socket

header

  • set
    • 返回this.header
  • get
    • 如果this.getHeaders是函数就执行该函数,否则按照顺序返回res._headers || {}

status

  • set
    • 将code数字赋值给this.res.statusCode.如果this.body不为false并且http状态码为返回空body的类型,则将this.body赋值为null
  • get
    • 返回this.res.statusCode

message

  • set
    • 接收一个msg并将其赋值给this.res.statusMessage
  • get
    • 按照this.res.statusMessage || statuses[this.status]的顺序返回值

body

  • set
    • 接收val参数,对无内容,buffer,stream,overwriting,json这些状况有各自的处理方式.
  • get
    • 返回this._body

length

  • set
    • 使用this.set对'Content-Length'属性设置参数
  • get
    • content-length为null,就会通过Buffer.byteLength(this.body)来返回长度,反正直接返回content-length的长度.

headerSent

  • get
    • 返回this.res.headersSent

vary

  • 如果this.res.headersSent;为真返回void.
  • 否则执行vary(this.res, field)
    • 该函数用以设置header的vary属性

redirect

  • 接收url和alt字符串,分别对location,status,html与text进行处理,其中status部分设置http状态码为302,html与text则设置重定向信息,html的escape函数用于转义特定字符.

attachment

  • 接收一个filename字符串,如果该字符串不为false,那么就将extname(filename)的返回值赋值给this.type.之后会设置'Content-Disposition'属性

lastModified

  • set
    • 接收一个val参数,类型为Date或字符串.如果val是字符串,则将new Date(val)的结果给val.之后将val.toUTCStrign()的结果作为'Last-Modified'的值.
  • get
    • 获取'last-modified'的值并赋值给date,如果该值不为false那么返回new Date(date)的结果.

etag

  • set
    • 进行W/的正则检测后设置为ETag的值
  • get
    • 获取this.get('ETag')的返回值

type

  • set
    • 接收一个type字符串,如果getType(type)的结果为真,那么就设置'Content-Type',否则移除'Content-Type'.
  • get
    • 获取header的'Content-Type'属性值,如果该值为false就返回空字符串,否则以';'符号分割后返回数组中的第一个元素.

is

get

  • 返回header指定的属性值

set

  • 接收header属性名field与值val,然后通过this.res.setHeader(field,val)函数进行设置.

append

  • 接收field和val字符串,通过this.get(field)获取header对应属性的值,然后将值转换成数组后赋值给val,最后通过this.set(field,val)设置header的属性值.

remove

  • 接收一个field字符串.如果this.headerSent为真则返回void.否则通过htis.res.removeHeader(filed)去移除指定的header属性.

writable

  • get
    • 会先通过this.res.finished检测是否已经完成了相应,完成相应会返回false.之后如果socket不为false则会返回socket.writable.

inspect

  • 将this.toJSON的结果赋值给o,并将this.body赋值给o.body并返回o.

toJSON

  • 将第二个参数的值添加到第一个参数的键位中

flushHeaders

  • 会执行this.res.flushHeaders函数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容