Koa 的 Context 对象详解

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()}`);

Koa 使用案例

github.com/react-low-c...

相关推荐
又写了一天BUG1 小时前
npm install安装缓慢及npm更换源
前端·npm·node.js
danplus2 小时前
node发送邮件:如何实现Node.js发信功能?
服务器·node.js·外贸开发信·邮件群发·蜂邮edm邮件营销·邮件接口·营销邮件
青稞儿3 小时前
面试题高频之token无感刷新(vue3+node.js)
vue.js·node.js
一个很帅的帅哥15 小时前
实现浏览器的下拉加载功能(类似知乎)
开发语言·javascript·mysql·mongodb·node.js·vue·express
Bang邦19 小时前
使用nvm管理Node.js多版本
前端·node.js·node多版本管理
新知图书19 小时前
Node.js快速入门
node.js
FakeOccupational20 小时前
nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink
前端·npm·node.js
亦舒.21 小时前
JSDelivr & NPM CDN 国内加速节点
前端·npm·node.js
代码搬运媛21 小时前
code eintegrity npm err sha512
前端·npm·node.js
猿来如此呀1 天前
运行npm install 时,卡在sill idealTree buildDeps没有反应
前端·npm·node.js