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

相关推荐
丰云3 小时前
一个简单封装的的nodejs缓存对象
缓存·node.js
泰伦闲鱼3 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
敲啊敲95274 小时前
5.npm包
前端·npm·node.js
j喬乔5 小时前
Node导入不了命名函数?记一次Bug的探索
typescript·node.js
z千鑫7 小时前
【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤
前端·vue.js·node.js
小马哥编程12 小时前
原型链(Prototype Chain)入门
css·vue.js·chrome·node.js·原型模式·chrome devtools
蜜獾云18 小时前
npm淘宝镜像
前端·npm·node.js
dz88i818 小时前
修改npm镜像源
前端·npm·node.js
CodeChampion1 天前
61.基于SpringBoot + Vue实现的前后端分离-在线动漫信息平台(项目+论文)
java·vue.js·spring boot·后端·node.js·maven·idea
小王码农记1 天前
解决npm publish发布包后拉取时一直提示 Couldn‘t find any versions for “包名“ that matches “版本号“
前端·npm·node.js