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

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...