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

news2024/10/5 21:14:28

以用户注册接口为例,需要在请求里携带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 类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八、Drf解析器

八、解析器 8.1概念 解析用户请求发送过来的数据(常用的是JSON) 请求类型: get: ​ 方式1: http://127.0.0.1/web/?arg1v1&arg2v2 ​ 方式2:通过请求头发送 post: ​ 请求头: ​ content-typ…

数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)

数据库管理247期 2024-10-04 数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)1 分区、表空间和Chunk(块)2 表空间组3 分片表4 分片表族5 复制表6 在所有分片上创建的非表对象总结 数据库管理-第247期 …

C++——模板进阶、继承

文章目录 一、模板1. 非类型模板参数2. 模板的特化函数模板特化类模板特化1. 全特化2. 偏特化部分特化参数更进一步的限制 二、继承1. 概念2. 定义定义格式 3. 继承基类成员访问⽅式的变化4. 继承类模板5.基类和派⽣类间的转换6. 继承中的作⽤域隐藏规则: 7. 派⽣类…

LinuxO(1)调度算法

概念 在Linux中,O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的,与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列,一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

阳台山足球营地的停车位探寻

阳台山足球营地的环境是真好哈。停车场名称:阳台山森林公园配套停车场。应该很多爬山的人车子也停在这里。而且我没想到的,阳台山的山泉水还有不少居民每天提着空桶去山上装。看来环境是真的很好哈 停车场有地面和地下停车场,停车位个数查不…

Linux驱动开发(速记版)--设备模型

第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备,但对于电源管理和热插拔,不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系,提供API处理设备…

若依使用(二次开发)

RouYi-MT RouYi-MT下载: 下载地址 RouYi-MT的使用(修改若依代码中文件夹得统一包名) 将对应的Springboot文件压缩成压缩包。 填写对应的参数,生成修改后的文件。 开发步骤 1.创建子项目到RouYi-springboot中,添加…

简单易懂的springboot整合Camunda 7工作流入门教程

简单易懂的Spring Boot整合Camunda7入门教程 因为关于Spring Boot结合Camunda7的教程在网上比较少,而且很多都写得有点乱,很多概念写得太散乱,讲解不清晰,导致看不懂,本人通过研究学习之后就写出了这篇教学文档。 介…

我的创作纪念日一年

目录 机缘 收获 日常 成就 憧憬 机缘 我之所以开始写CSDN博客,源于一段特殊的时光。去年此时,我独自待在实验室,周围的世界仿佛与我无关。没有旅游,没有与朋友的欢聚,情感的挫折和学业的压力如潮水般袭来。在这样的…

2025舜宇招聘【内推码】

【2025内推码】 DSwNQ9yu DSJXN8Mr 舜宇集团2025届全球校园招聘正式启动!!! 专业需求:机械、自动化、电子、电气、通信、控制、测控、计算机、软件、物理、光学等专业; 工作地点:宁波余姚、浙江杭州、广东…

97. UE5 GAS RPG 实现闪电链技能(二)

书接上回,如果没有查看上一篇文章的同学推荐先看上一章,我们接着实现闪电链技能。 在上一章最后,我们实现了闪电链的第一条链,能够正确显示特效,接下来,我们先实现它的音效和一些bug修复。 我们在多端网络里…

(9)MATLAB瑞利衰落信道仿真2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、瑞利衰落信道二、瑞利衰落信道建模三、仿真结果二、高斯随机变量和瑞利随机变量后续 前言 本文首先给出瑞利衰落信道模型,并根据瑞利衰落变量估…

乌班图基础设施安装之Mysql8.0+Redis6.X安装

简介:云服务器基础设施安装之 Mysql8.0Redis6.X 安装 Docker安装 # 按照依赖 yum install -y yum-utils device-mapper-persistent data lvm2 Docker Mirror 从去年开始. hub.docker.com[1] 在国内的访问速度极慢. 当时大家主要还是依赖国内的一些镜像源: 如中科…

【JNI】数组的基本使用

在上一期讲了基本类型的基本使用,这期来说一说数组的基本使用 HelloJNI.java:实现myArray函数,把一个整型数组转换为双精度型数组 public class HelloJNI { static {System.loadLibrary("hello"); }private native String HelloW…

AI编程工具的崛起:效率提升的未来在哪里?

你正在使用的编程工具会被淘汰吗?AI编程工具正在改变这一切! 在日益忙碌的开发世界里,工具的选择决定了开发者的工作效率。在过去的十年里,从代码编辑器到版本控制工具,各种工具帮助开发者逐步优化了工作流程&#xf…

C/C++逆向:函数逆向分析-调用约定分析

在进行函数逆向分析时,分析其函数调用约定具有非常重要的作用,因为调用约定直接影响了函数的参数传递、返回值、栈管理、寄存器使用等多个方面,不同的编译器和平台可能有不同的默认调用约定,识别调用约定可以帮助判断代码是由哪种…

HTB:Mongod[WriteUP]

连接至HTB服务器并启动靶机 靶机IP:10.129.99.33 分配IP:10.10.16.12 1.How many TCP ports are open on the machine? 使用nmap对靶机进行全端口TCP脚本、服务扫描: nmap -sC -sV -T4 -p- {TARGET_IP} 可以看到靶机共开放TCP端口2个&…

LC108-将有序数组转化为二叉搜索树(二叉平衡树)

文章目录 1 题目2 思路3 ACM完整代码参考 1 题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树 示例: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释&#xff1…

最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )

Openai 上线语音模型whisper-large-v3-turbo 在本文中,我们将介绍 whisper-large-v3-turbo 以及 whisper-web(一个直接在浏览器中进行ML语音识别的开源项目)。 尽管近年来出现了许多音频和多模态模型,但Whisper 仍是生产级自动语音…

类型模板参数与非类型模板参数

在C中,模板参数分为两种类型:类型参数和非类型参数。类型参数是指定模板类型名称的参数,而非类型参数是指定模板整型常量的参数。 模板参数不限定于类型,普通值也可作为模板参数,但这里值的类型只能是整形家族&#x…