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

nginx运行时报:No rule to make target ‘build‘, needed by ‘deault‘.Stop
项目场景: 部署前端项目,将打好的前端包,放到服务器上,运行nginx执行,结果nginx运行报错。 问题描述 nginx运行报以下错误: No rule to make target ‘build‘, needed by ‘deault‘.Stop原因分析&…...

dvwa:暴力破解、命令注入、csrf全难度详解
暴力破解 easy模式 hydra -L /usr/share/wordlists/SecLists-master/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/SecLists-master/Passwords/500-worst-passwords.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username^USER^&…...

Java-学生管理系统[初阶]
这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现: 📚 学生管理系统[初阶](不带模拟登录系统) &#…...

微信小程序 详情图片预览功能实现详解
详情图片预览功能实现详解 在开发微信小程序时,我们经常需要实现点击商品图片进行全屏预览的功能。这不仅提升了用户体验,还允许用户进行保存图片、发送给朋友等操作。本文将详细介绍如何实现这一功能。 思路分析 当用户在商品详情页点击图片时&#…...

LeetCode 48 Rotate Image 解题思路和python代码
题目: You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …...

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新
华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…...

51WORLD携手浙江科技大学,打造智慧校园新标杆
当前,国家教育数字化战略行动扎实推进,高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇,浙江科技大学联合51WORLD、正方软件股份有限公司(简称:正方软件),共同研发打造浙科大孪生数智校…...

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)
好久没写SD了,今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程(引合和見積(询价和报价)) - 数据流的概念,主要就是后传票可以参照前传票,以实现数据的流动,减少输入 - Co…...

【ROS2】里程计(odometry)数据计算、发布
1、里程计消息 1.1 Odometry消息 消息描述:nav_msgs::msg::Odometry 是ROS2中用发布里程计信息的消息,包括:线速度、角速度、位置和朝向 消息路径:/opt/ros/humble/share/nav_msgs/msg/Odometry.msg 消息内容: # 包含父ID std_msgs/Header header# 子ID,即姿势所在的坐…...

AcWing 187 导弹防御系统 暴搜
代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 200010, mod 1e9 7;int n, m, k, x, y, z, ans, t, depth; int w[N], f[N]; int up[N], down[N];bool dfs(int depth, int u, int su, int sd) {if (su sd > depth) return …...