Koa 将 Node.js 的 request 和 response 对象都封装到了 Context 对象上,总体来看,服务端响应 HTTP 请求分为 3 步,首先从 request 对象上读取客户端传递给服务端的数据,然后根据 request 对象上的数据计算客户端要想实现的需求,最后服务端将处理结果赋值在 response 对象上返回给客户端。
为了开发便捷,Context 对象上有很多更简洁方法委托到了 request 和 response 对象上,也就是说不必访问 request 和 response 对象也能实现你的目的,比如 context.type 和 context.length 委托给了 response 对象,context.path 和 context.method 委托给了 request。下面介绍一些 Context 对象上的常用属性和方法。
context.cookies
context.cookies 是一个与读取和设置 cookie 相关的属性。读取客户端发送的 cookie 用context.cookies.get(name, [options]);设置要发送到客户端的cookie用context.cookies.set(name, value, [options])。options 是一个对象,它可能的属性如下:
- maxAge:从 Date.now() 得到的毫秒数。
- expires:cookie过期的日期。
- path:cookie所在的路径,默认值是/,这表示根目录。
- domain:cookie所在的域。
- secure:cookie是否只通过HTTPS协议发送。HTTP协议的默认为false, HTTPS的默认为true。
- httpOnly:cookie是否只通过HTTP/HTTPS发送,而不提供给客户端JavaScript访问,默认为true。
- priority:cookie的优先级,可能的值有'low', 'medium'和 'high'。
- sameSite:cookie是否是"sameSite"的,可能的取值有'strict', 'lax', 'none'和 true(对应'strict')。
- signed:cookie是否需要签名,默认值是false。如果是true,那么另外一个带有.sig后缀的同名cookie也会被发送。
- overwrite:是否覆盖先前设置的同名cookie,默认为false。
context.throw
这个方法用于抛出错误,用法为context.throw([status], [msg], [properties]),代码如此:
csharp
context.throw(400);
context.throw(400, 'name required');
context.throw(400, 'name required', { user: user });
给 ctx.throw 传递的错误信息不会返回给客户端,它只用于服务端统计或排查错误。
context.status=value
设置响应状态,如果未设置手动设置,Koa 会将状态值自动设置为200或204。
context.type=value
设置响应的 Content-Type 字段,它能设置的值是 MIME 类型或者文件扩展名,如果未设置context.type,那么将根据 context.body 的值推断 context.type 的值。浏览器通常使用 MIME 类型来确定如何处理 URL,而不管文件扩展名是什么,因此 Web 服务器在响应头中给 Content-Type 设置正确的 MIME 类型至关重要。如果服务器将某 CSS 文件的 Content-Type 设置为 text/plain,那么浏览器下载该文件之后不会认为这是 CSS 文件,CSS 文件的 Content-Type 需要使用 text/css。
MIME 类型对大小写不敏感,通常使用小写,组成结构为 type/subtype。MINE 类型分为独立类型和 Multipart 类型,独立类型表明了文件的分类,Multipart 类型表示细分领域的文件类型。
独立类型有如下取值:
(1)text
表明这是普通文本,典型示例有:text/html、text/plain、text/css、text/javascript。
(2)image
表明这是图像文件,典型的示例有:image/gif、image/png、image/bmp、image/jpeg。
(3)audio
表明这是音频文件,典型的示例有:audio/webm、audio/wav、audio/mpeg。
(4)video
表明这是视频文件,典型的示例有:video/webm、video/ogg。
(5)application
表明这是二进制数据,典型的示例有:application/octet-stream、application/pkcs12、application/pdf。
Multipart类型有如下取值:
(1)multipart/form-data
可用于浏览器表单提交。
(2)multipart/byteranges
用于把部分响应报文发送回浏览器。
context.body=value
设置响应体,context.body可能赋值的数据类型有如下4种:
(1)String
将字符串赋值给context.body,Content-Type默认值为text/html或text/plain。
(2)Buffer
将buffer数据赋值给context.body,Content-Type默认值为application/octet-stream。
(3)Stream
将流数据赋值给context.body,Content-Type默认值为application/octet-stream。
(4)Object
将对象赋值给context.body,包括普通对象 { foo: 'bar' } 和数组 ['foo', 'bar'],此时Content-Type默认值为application/json。
context.set(...)
该方法用于设置响应标头,它用两种用法,分别是context.set(field, value)和context.set(fields),示例代码如下:
javascript
context.set({
'Access-Control-Allow-Origin':'*',
'Access-Control-Allow-Methods': 'GET,POST'
})
context.set('X-Response-Time', `${new Date().getTime()}`);