当前位置: 首页 > news >正文

Koa2项目实战3 (koa-body,用于处理 HTTP 请求中的请求体)

以用户注册接口为例,需要在请求里携带2个参数:用户名(user_name)和密码(password)。
开发者需要在接口端,解析出user_namepassword

在使用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-urlencodedmultipart/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-urlencodedmultipart/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 的说明

GETHEADDELETE 请求对于请求体没有定义的语义,但这并不意味着在某些特定用例中它们可能不是有效的。
koa-body 在默认情况下是严格的,仅解析 POSTPUTPATCH 请求。
开发者可以使用枚举(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 中间件时,会发生以下一系列的过程:

  1. 请求接收阶段:

    1. 当客户端向服务器发送请求时,请求首先到达 Koa 应用。
    2. Koa 按照中间件的注册顺序依次调用中间件函数。
  2. 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(仅在多部分表单数据请求中可用)数组中。
  3. 后续中间件和路由处理

    1. 经过 koa-body 中间件处理后,请求继续传递给下一个中间件或路由处理函数。
    2. 后续的中间件和路由处理函数可以通过 ctx.request.bodyctx.request.files来获取解析后的请求体数据和上传的文件信息,进行进一步的业务逻辑处理。
      • 例如,在一个处理用户注册的路由中,可以从 ctx.request.body 中获取用户提交的表单数据,包括用户名、密码等信息,进行数据验证和存储到数据库等操作。如果有文件上传,如用户上传头像图片,可以从 ctx.request.files 中获取上传的文件信息,进行文件存储和处理。
  4. 响应发送阶段

    1. 当所有中间件和路由处理函数执行完毕后,Koa 根据处理结果生成响应。
    2. 将响应发送回客户端,完成一次请求 - 响应循环。

API 详细说明

  • ctx.request.body:包含解析后的请求体。
    • 如果请求体是 JSON 格式,则会被解析为一个 JavaScript 对象。
    • 如果请求体是 application/x-www-form-urlencodedmultipart/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数据集是一个公开的数据集&#xff0c…...

牛客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年腾讯外包面试题(微创公司)

笔试&#xff1a; 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…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...