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

相关推荐
糖拌西瓜皮9 小时前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js
智通1 天前
Node.js事件循环核心机制
node.js
初圣魔门首席弟子1 天前
Node.js 详细介绍(知识库版)
windows·qt·node.js·知识库
糖拌西瓜皮1 天前
Java 开发者如何快速上手 Node.js:一份从入门到进阶的学习路线
node.js
yspwf1 天前
NestJS 配置管理完整方案
后端·架构·node.js
网络点点滴1 天前
Node.js事件驱动架构
架构·node.js
weixin_471383031 天前
Node.js + Express 入门实战笔记-01-基础
node.js·lua·express
Rain5092 天前
2.2 数据基础:数据库集成与 ORM(TypeORM / Prisma)
数据库·人工智能·ai·数据分析·node.js·自动化·ai编程
大家的林语冰2 天前
npm 不忍了,正式上线“阶段式发布“的新功能,进一步对抗频繁的供应链攻击!
前端·javascript·node.js
天蓝色的鱼鱼2 天前
Node.js 现在能直接跑 TypeScript 了,tsx 和 ts-node 还需要吗?
前端·typescript·node.js