Koa2项目实战3 (koa-body,用于处理 HTTP 请求中的请求体)
以用户注册接口为例,需要在请求里携带2个参数:用户名(user_name)和密码(password)。
开发者需要在接口端,解析出user_name 、password。
在使用Koa开发的接口中,如何解析出请求携带的参数呢?
koa-body
koa-body是一个用于 Koa 框架的中间件,它主要用于处理 HTTP 请求中的请求体。
安装koa-body
npm install koa-body -D
主要功能
- 可处理的请求类型
multipart/form-data:用于文件上传和包含复杂表单数据的请求。application/x-www-form-urlencoded:常见的表单数据编码格式,用于简单的表单提交。application/json:以 JSON 格式传输数据的请求。application/json-patch+json:用于对 JSON 数据进行补丁操作的请求格式。application/vnd.api+json:可能是一种特定的 API 数据格式。application/csp-report:内容安全策略(CSP)违规报告的请求格式。text/xml:XML 格式的请求。
- 解析请求体
- 可以解析各种类型的请求体,包括表单数据、JSON 数据、文件上传等。
- 对于表单数据,它可以解析
application/x-www-form-urlencoded和multipart/form-data类型的请求体。 - 对于 JSON 数据,它可以解析
application/json类型的请求体。
- 提供方便的访问方式
- 解析后的请求体数据可以通过
ctx.request.body来访问。 - 如果是表单数据,可以通过
ctx.request.body[fieldName]来访问特定字段的值。 - 如果是 JSON 数据,可以直接访问对象属性,例如
ctx.request.body.propertyName。
- 解析后的请求体数据可以通过
- 文件上传处理
- 对于文件上传,
koa-body可以将上传的文件存储在指定的目录中,并提供文件的信息,如文件名、大小、路径等。 - 可以通过配置选项来控制文件上传的大小限制、存储路径等。
- 对于文件上传,
- 中间件模式
koa-body允许在不同的中间件之间共享解析后的请求体,而无需重复解析。
- 错误处理
- 内置了对解析过程中的错误进行捕获和处理,避免因解析问题导致应用崩溃。
Options 选项
patchNode {Boolean}:是否将请求体修补到 Node.js 的ctx.req,默认为false。patchKoa {Boolean}:是否将请求体修补到 Koa 的ctx.request上,默认为true。jsonLimit {String|Integer}:设置 JSON 请求体的字节大小限制,默认为1mb。formLimit {String|Integer}:设置表单格式请求体的字节大小限制,默认为56kb。- 表单格式:
application/x-www-form-urlencoded和multipart/form-data
- 表单格式:
textLimit {String|Integer}:设置文本格式请求体的字节大小限制,默认为56kb。encoding {String}:设置传入表单字段的编码,默认为utf-8。multipart {Boolean}:是否解析多部分格式(multipart/form-data)的请求体,默认为false。urlencoded {Boolean}:是否解析 URL 编码的表单请求体,默认为true。text {Boolean}:是否解析文本格式的请求体(如 XML),默认为true。json {Boolean}:是否解析 JSON 格式的请求体,默认为true。jsonStrict {Boolean}:切换co-body的严格模式。默认为true。- 如果设置为
true,则只解析数组或对象。
- 如果设置为
includeUnparsed {Boolean}:切换co-body的returnRawBody选项。默认为false。- 如果设置为
true,对于表单编码和 JSON 请求,原始的、未解析的请求体将使用Symbol附加到ctx.request.body上。
- 如果设置为
formidable {Object}:传递给formidable多部分解析器的选项。
用于配置multipart/form-data请求的处理。可以包含以下属性:uploadDir:文件上传的目录。默认为操作系统的临时目录。keepExtensions:是否保留上传文件的扩展名。默认为false。maxFieldsSize:表单字段的最大大小。默认为2mb。maxFields:表单字段的最大数量。默认为1000。hash:用于计算上传文件的哈希值的算法。默认为false。如果设置为一个字符串,则会使用指定的算法计算哈希值,并将哈希值添加到文件对象的hash属性中。
onError {Function}:自定义错误处理函数,如果抛出错误,可以自定义响应 ——onError(error, context),默认情况下会抛出错误。parsedMethods {String[]}:声明将解析请求体的 HTTP 方法,默认为['POST', 'PUT', 'PATCH'],取代了strict选项。
关于 parsedMethods 的说明
GET、HEAD 和 DELETE 请求对于请求体没有定义的语义,但这并不意味着在某些特定用例中它们可能不是有效的。
koa-body 在默认情况下是严格的,仅解析 POST、PUT 和 PATCH 请求。
开发者可以使用枚举(enumeration)或者字符串来选择要解析的方法。例如,HttpMethodEnum.PATCH。
使用koa-body解析 body
在app/index.js中,引入koa-body,注册koa-body为 koa 中间件:
const Koa = require('koa');
// 引入koaBody,注意:koaBody是一个函数
const { koaBody } = require('koa-body')const userRoute = require('../router/userRoute')const app = new Koa();// koaBody是一个函数
// 因为koaBody负责解析请求体,因此,应该在所有路由处理之前注册koaBody中间件。
// 中间件的作用是在请求到达路由处理函数之前,对请求进行预处理。
app.use(koaBody())// 注册中间件,注意:app.use 必须接收函数作为中间件
app.use(userRoute.routes())module.exports = app
改写controller/userController.js:
class userController {async register(ctx, next) {// 所有在node.js 环境的打印,都会展示在终端console.log(ctx.request.body)// 把请求体作为返回内容ctx.body = ctx.request.body}
}// 导出userController的实例(new userController()是一个对象)
module.exports = new userController()
使用 postman 测试接口:

接口成功读取了user/register请求携带的参数,并将请求体作为返回内容。
koa-body注册为 Koa 中间件,发生了什么
当把 koa-body 注册为 Koa 中间件时,会发生以下一系列的过程:
-
请求接收阶段:
- 当客户端向服务器发送请求时,请求首先到达 Koa 应用。
- Koa 按照中间件的注册顺序依次调用中间件函数。
-
koa-body中间件执行:koa-body中间件开始处理请求体。- 对于不同类型的请求体格式,如 JSON(
application/json)、表单数据(application/x-www-form-urlencoded)和多部分表单数据(multipart/form-data),分别进行解析。 - 根据配置选项,如
jsonLimit(JSON 请求体大小限制)、formLimit(表单请求体大小限制)等,确保请求体在可接受的范围内。 - 如果请求体是 JSON 格式,将其解析为一个 JavaScript 对象,并将这个对象存储在
ctx.request.body中,以便后续的中间件和路由处理函数可以方便地访问和处理这些结构化的数据。 - 如果是表单数据格式,同样将其解析为一个对象并存储在
ctx.request.body。对于多部分表单数据,除了解析表单字段外,如果有文件上传,还会处理文件上传操作。将上传的文件存储在服务器的临时位置,并将文件信息(如文件名、文件路径、文件大小、文件 MIME 类型等)封装成文件对象,存储在ctx.request.files(仅在多部分表单数据请求中可用)数组中。
- 对于不同类型的请求体格式,如 JSON(
-
后续中间件和路由处理
- 经过
koa-body中间件处理后,请求继续传递给下一个中间件或路由处理函数。 - 后续的中间件和路由处理函数可以通过
ctx.request.body和ctx.request.files来获取解析后的请求体数据和上传的文件信息,进行进一步的业务逻辑处理。- 例如,在一个处理用户注册的路由中,可以从
ctx.request.body中获取用户提交的表单数据,包括用户名、密码等信息,进行数据验证和存储到数据库等操作。如果有文件上传,如用户上传头像图片,可以从ctx.request.files中获取上传的文件信息,进行文件存储和处理。
- 例如,在一个处理用户注册的路由中,可以从
- 经过
-
响应发送阶段
- 当所有中间件和路由处理函数执行完毕后,Koa 根据处理结果生成响应。
- 将响应发送回客户端,完成一次请求 - 响应循环。
API 详细说明:
ctx.request.body:包含解析后的请求体。- 如果请求体是 JSON 格式,则会被解析为一个 JavaScript 对象。
- 如果请求体是
application/x-www-form-urlencoded或multipart/form-data格式,则会被解析为一个对象或一个包含文件对象的对象。
ctx.request.files:仅在multipart/form-data请求中可用。包含上传的文件对象的数组。
每个文件对象包含以下属性:name:文件字段的名称。path:文件在服务器上的临时路径。size:文件的大小。type:文件的 MIME 类型。
相关文章:
Koa2项目实战3 (koa-body,用于处理 HTTP 请求中的请求体)
以用户注册接口为例,需要在请求里携带2个参数:用户名(user_name)和密码(password)。 开发者需要在接口端,解析出user_name 、password。 在使用Koa开发的接口中,如何解析出请求携带…...
复盘20241012
1、 classpath "com.android.tools.build:gradle:8.5.1" 的版本 与distributionUrlhttps\://services.gradle.org/distributions/gradle-8.9-bin.zip的对应规则: Execution failed for task :app:compileDebugKotlin. 解决方案 切换 setting --> ot…...
泊松流负载均衡控制
目录 泊松流负载均衡控制 一、到达率λ 二、服务率μ 三、泊松流负载均衡控制 泊松流负载均衡控制 在探讨泊松流负载均衡控制时,我们主要关注的是到达率λ和服务率μ这两个核心参数。以下是对这两个参数及其在泊松流负载均衡控制中作用的详细解释: 一、到达率λ 定义:…...
3D打印矫形器市场报告:未来几年年复合增长率CAGR为10.8%
3D 打印矫形器是指使用 3D 打印技术制作的定制外部支撑装置。它们有助于稳定、引导、缓解或纠正肌肉骨骼状况,并根据个体患者的解剖结构进行设计,通常使用 3D 扫描和建模技术。3D 打印在矫形器方面的主要优势是能够生产精确适合患者解剖结构的定制装置&a…...
Richtek立锜科技线性稳压器 (LDO) 选型
一、什么是LDO? LDO也可称为低压差线性稳压器,适合从较高的输入电压转换成较低输出电压的应用,这种应用的功率消耗通常不是很大,尤其适用于要求低杂讯、低电流和输入、输出电压差很小的应用环境。 二、LDO的特性 LDO透过控制线性区调整管…...
Leetcode 前 k 个高频元素
使用最小堆算法来解决这道题目:相当于有一个容量固定为K的教室,只能容纳 K 个人,学生们逐个逐个进入该教室,当教室容量达到K人之后,每次进入一个新的学生后,我们将分数最低的学生(类似本题中的频率最低元素…...
[LeetCode] 面试题01.02 判定是否互为字符重拍
题目描述: 给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 示例 1: 输入: s1 "abc", s2 "bca" 输出: true 示例 2&am…...
数据结构-4.5.KMP算法(旧版上)-朴素模式匹配算法的优化
朴素模式匹配算法最坏的情况: 一.实例: 第一轮匹配失败,开始下一轮的匹配: 不断的操作,最终匹配成功: 如上述图片所述,朴素模式匹配算法会导致时间开销增加, 优化思路:主…...
STM32 QSPI接口驱动GD/W25Qxx配置简要
STM32 QSPI接口GD/W25Qxx配置简要 📝本篇会具体涉及介绍Winbond(华邦)和GD(兆易创新) NOR flash相关型号指令差异。由于网络上可以搜索到很多相关QSPI相关知识内容,不对QSPI通讯协议做深度解析。 🔖首先确保所使用的ST…...
UCI-HAR数据集深度剖析:训练仿真与可视化解读
在本篇文章中,我们将深入探讨如何使用Python对UCI人类活动识别(HAR)数据集进行分割和预处理,以及运用模型网络CNN对数据集进行训练仿真和可视化解读。 一、UCI-HAR数据集分析及介绍 UCI-HAR数据集是一个公开的数据集,…...
牛客SQL练习详解 06:综合练习
牛客SQL练习详解 06:综合练习 SQL34 统计复旦用户8月练题情况SQL35 浙大不同难度题目的正确率SQL39 21年8月份练题总数 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! SQL34 统…...
k8s apiserver高可用方案
目前官方推荐有 2 种方式部署k8s apiserver 高可用 keepalived and haproxy 部署有2种方式,一种是systemd管理的,另一种是pod形式,使用那种可以根据实际情况选择 服务部署 systemd方式 可以通过包管理工具安装,正常启动之后&…...
服务器数据恢复—硬盘坏扇区导致Linux系统服务器数据丢失的数据恢复案例
服务器数据恢复环境: 一台linux操作系统网站服务器,该服务器上部署了几十个网站,使用一块SATA硬盘。 服务器故障&原因: 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败,于是将服务器上的硬盘拆下检测…...
【多线程】多线程(12):多线程环境下使用哈希表
【多线程环境下使用哈希表(重点掌握)】 可以使用类:“ConcurrentHashMap” ★ConcurrentHashMap对比HashMap和Hashtable的优化点 1.优化了锁的粒度【最核心】 //Hashtable的加锁,就是直接给put,get等方法加上synch…...
轻量服务器和云服务器ecs哪个好用一些?
轻量服务器和云服务器ecs哪个好用一些?轻量服务器与云服务器ECS在多方面存在显著差异,对于需要高性能计算和大规模数据处理的用户来说,ECS可能是更好的选择;而对于预算有限且需求较为简单的用户来说,轻量服务器可能更为…...
【交通标志识别系统】Python+卷积神经网络算法+人工智能+深度学习+机器学习+算法模型
一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高…...
特种设备作业叉车司机试题附答案
1.发生事故要本着"( )不放过"的原则,查明原因、分清责任、严肃处理。 A.三 B.四 C.五 答案:B 2.柴油发动机在压缩行程终了时气体的温度和压力都比汽油机( )。 A.低 B.高 C.相同 答案:B 3.柴油发动机的压缩比比汽…...
【Nginx系列】Nginx启动失败
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
2024/10/12 计组大题专训
2018: 2019: 2020: 2021:...
2024年腾讯外包面试题(微创公司)
笔试: 1、判断异步执行顺序 console.log(1);setTimeout(()>{Promise.resolve().then(()>{console.log(2);})console.log(3);},0);new Promise ((resolve)>{for(let i0; i<1000;i ){if(i1000){resolve();}}console.log(4);}).then(()>{console.log(5…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
