context.js
这一部分,定义了Koa的Context对象,其实,这一部分,粗略的看过去,就是把Koa的request
和response
两个对象合到一个context
里边,同时加了一些错误处理的便捷方式。
delegation
|
|
最后这一部分代码,就是让ctx
可以方便的使用response
和request
里的东西,做了一个delegate,本来需要:ctx.response.attachment()
,这样只需要:ctx.attachment()
.
异常/错误处理
|
|
用的分别是http-assert
和http-errors
来进行assert和error处理
this.onerror(error){...}
的处理:
```js
// delegate
this.app.emit(‘error’, err, this); // >>: here pass the context
这里判断是不是需要对客户端做出response,如果已经sent了,那么就不用做啥了,否则需要处理response返回给客户端。
后边的代码无非是对不同情况的判断,做出合适的response。
Cookies处理
|
|
生成一个唯一的symbol
get和set分别是这样的操作:
|
|
判断如果cookie不存在的话,生成之。
OK,以上就是context
的全部内容,主要的工作,还是把request
和response
合成一个。
request.js
700+ line的文件,其实,比较容易看懂,绝大部分的内容,都是对node原有的req的封装和简易处理。
inspect()
, toJSON()
和之前的没有太大的区别。
大量的内容,都是对原来的req
的封装,好奇这里为什么不用delegate直接写完,非要写这么多的代码。
原模原样access的有:
- header/headers: 请求头
- url
- method: 请求方法,比如
GET
- socket
添加处理的:
- origin: protocol://host
- href: href
- host: 获取host
- hostname: 获取hostname
- URL: 返回URL对象,lazy生成
- fresh: last-modified/etag 是否匹配
- stale: !fresh,已经修改了,需要重新获取
- idempotent: 看请求方法是不是安全的
- charset: content-type里的charset
- length: content-length
- protocol: 使用的协议,http/https等
- ips: 当proxy存在的时候,得到ip list
- ip: remote address
- subdomains: 获取subdomain数组
- secure: 判断是不是https
- path: path
- query: 路径里的query信息
- querystring
- search: querystring带前边的问号
其它一些method/property:
accept
, acceptsEncodings
, acceptsCharsets
, acceptsLanguages
:
判断请求是否accept对应的类型,用的accepts
is
:
判断请求的content-type是不是自己想要的,用的type-is
type
:
返回MIME类型
get
:
get对应的header内容,这里还处理了referer
的拼写错误,自己也是第一次注意到。
总结来看,request
部分做的,就是对于node的req
的封装,同时添加了一些helper方法,比如accept
,is
等。
response.js
不出意外的话,Response也是对Node的res
的封装,看一看有什么值得看的地方。
access原来Node的res
- socket
- status
- statusMessage
- statusMessage=
- headers
- length=: content-length
- headerSent
- etag=
- flushHeaders
添加处理的
- status=: 加入了一些验证,以及对body的处理(如果对应的status body为空,需要设置)
- length: content-length,如果没有的话,自己需要得到body的长度
- type=: 设置content-type,有一定判断
- lastModified: 有一个时间的转换
- lastModified=
- etag: 考虑了ETag的两种格式
- type: content-type,去除了后边诸如
charset
之类的东西 - header处理:
get
: 获取headerset
: setHeader的封装,支持多种方式append
: append headerremove
: remove header
- writable: 是否可写,
socket.writable
,如果已经完成不可写
自己的property/method
body
:
操作http的body,需要进行不同情况的处理
- 内容为null: 204
- 如果没有设定过status,设为200
- 没有设置
content-type
,需要进行设定 - 对于不同类型的数据:
- string: 设定length, type
- buffer: type设为
bin
- stream:
- json: 设定type,remove
content-type
vary
:
设置Vary
header
redirect
:
重定向!
-如果参数是back: 回到上一页面
-设置status为302
-说明这在redirect
attachment
:
当有附加文件的时候,设置Content-Disposition
header,同时设置Content-Type
,用到了content-disposition
包
is
:
判断type是否满足,类似request
的
总体来看,response
和request
非常相似,封装res
,方便处理Node Response的header和body等