当前位置: 首页 > 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…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

是否存在路径(FIFOBB算法)

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

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...