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...

相关推荐
Q_Q5110082858 分钟前
python的软件工程与项目管理课程组学习系统
spring boot·python·django·flask·node.js·php·软件工程
outsider_友人A2 小时前
前端也想写后端(3)中间件Middleware、管道Pipes、拦截器Interceptors
前端·node.js·nestjs
爱加班的猫1 天前
Node.js 中 require 函数的原理深度解析
前端·node.js
冲!!1 天前
使用nvm查看/安装node版本
前端·node.js·node·nvm
萌萌哒草头将军2 天前
Node.js v24.6.0 新功能速览 🚀🚀🚀
前端·javascript·node.js
行星0082 天前
mac 通过homebrew 安装和使用nvm
macos·npm·node.js
kngines2 天前
【Node.js从 0 到 1:入门实战与项目驱动】1.3 Node.js 的应用场景(附案例与代码实现)
node.js
xrkhy3 天前
nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)
前端·npm·node.js
专注API从业者3 天前
Python/Node.js 调用taobao API:构建实时商品详情数据采集服务
大数据·前端·数据库·node.js
Q_Q19632884753 天前
python基于Hadoop的超市数据分析系统
开发语言·hadoop·spring boot·python·django·flask·node.js