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函數
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容