koa-body 的详细使用文档
目录
koa-body
install
Features
Hello World - Quickstart
Usage with koa-router
Usage with unsupported text body type
Options
关于 parsedMethods 的说明
文件支持
关于未解析请求主体的说明
一些强大的选择
使用总结
koa-body
功能齐全的 koa body 解析器中间件。支持 multipart、urlencoded 和 json 请求体。提供与 Express bodyParser - multer 相同的功能
install
Install with npm
npm install koa-body
Features
- 可以处理如下请求:
- multipart/form-data
- application/x-www-form-urlencoded
- application/json
- application/json-patch+json
- application/vnd.api+json
- application/csp-report
- text/xml
Koa 或 Node 补丁选项,或者文件上传正文、字段和文件大小限制
Hello World - Quickstart
npm install koa koa-body # Note that Koa requires Node.js 7.6.0+ for async/await support
index.js:
const Koa = require('koa');
const { koaBody } = require('koa-body');const app = new Koa();app.use(koaBody());
app.use((ctx) => {ctx.body = `Request Body: ${JSON.stringify(ctx.request.body)}`;
});app.listen(3000);
node index.js
curl -i http://localhost:3000/users -d "name=test"
Output:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 29
Date: Wed, 03 May 2017 02:09:44 GMT
Connection: keep-aliveRequest Body: {"name":"test"}%
有关更全面的示例,请参阅 examples/multipart.js
Usage with koa-router
通常最好只根据需要解析主体,如果使用支持中间件组合的路由器,我们可以仅为某些路由注入它。
const Koa = require('koa');
const app = new Koa();
const router = require('koa-router')();
const { koaBody } = require('koa-body');router.post('/users', koaBody(), (ctx) => {console.log(ctx.request.body);// => POST bodyctx.body = JSON.stringify(ctx.request.body);
});app.use(router.routes());app.listen(3000);
console.log('curl -i http://localhost:3000/users -d "name=test"')
Usage with unsupported text body type
对于不支持的文本主体类型,例如 text/xml,您可以在 ctx.request.body 中使用未解析的请求主体。对于文本内容类型,无需设置 includeUnparsed。
// xml-parse.js:
const Koa = require('koa');
const { koaBody } = require('koa-body');
const convert = require('xml-js');const app = new Koa();app.use(koaBody());
app.use((ctx) => {const obj = convert.xml2js(ctx.request.body);ctx.body = `Request Body: ${JSON.stringify(obj)}`;
});app.listen(3000);
node xml-parse.js
curl -i http://localhost:3000/users -H "Content-Type: text/xml" -d '<?xml version="1.0"?><catalog id="1"></catalog>'
Output:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 135
Date: Tue, 09 Jun 2020 11:17:38 GMT
Connection: keep-aliveRequest Body: {"declaration":{"attributes":{"version":"1.0"}},"elements":[{"type":"element","name":"catalog","attributes":{"id":"1"}}]}%
Options
koa-body 有多种选择。四种定制选择,其他来自 raw-body 和 formidable。
patchNode{Boolean}将请求主体补丁到 Node 的ctx.req,默认falsepatchKoa{Boolean}将请求体补丁为 Koa 的ctx.request,默认truejsonLimit{String|Integer} JSON 主体的字节(如果为整数)限制,默认1mbformLimit{String|Integer}表单主体的字节(如果为整数)限制,默认56kbtextLimit{String|Integer}文本主体的字节(如果为整数)限制,默认56kbencoding{String}设置传入表单字段的编码,默认utf-8multipart{Boolean}解析multipart主体,默认falseurlencoded{Boolean}解析 urlencoded 主体,默认truetext{Boolean}解析文本主体,例如 XML,默认truejson{Boolean}解析 JSON 主体,默认truejsonStrict{Boolean}切换 co-body 严格模式;如果设置为 true - 仅解析数组或对象,默认trueincludeUnparsed{Boolean}切换 co-body returnRawBody 选项;如果设置为 true,对于表单编码和 JSON 请求,将ctx.request.body使用Symbol(查看详细信息)附加原始未解析的请求正文,默认falseformidable{Object}传递给强大的多部分解析器的选项onError{Function}自定义错误处理,如果抛出错误,可以自定义响应 - onError(error, context),默认会抛出parsedMethods{String[]}声明将解析主体的 HTTP 方法,默认为['POST', 'PUT', 'PATCH']。替换strict选项。
关于 parsedMethods 的说明
see draft-ietf-httpbis-p2-semantics-19
GET、、HEAD和DELETE请求没有为请求正文定义语义,但这并不意味着它们在某些用例中可能无效。- koa-body 默认是严格的,只解析
POST、PUT和PATCH请求 - 您可以使用枚举或字符串来选择要解析的方法:例如,
HttpMethodEnum.PATCH
文件支持
已上传的文件可通过 访问ctx.request.files。
关于未解析请求主体的说明
某些应用程序需要对请求主体进行加密验证,例如来自 slack 或 stripe 的 webhook。如果koa-body 的选项中includeUnparsed有,则可以访问未解析的主体true。启用后,从 导入用于访问请求主体的符号unparsed = require('koa-body/unparsed.js'),或使用 定义您自己的访问器unparsed = Symbol.for('unparsedBody')。然后可以使用 来获取未解析的主体ctx.request.body[unparsed]。
一些强大的选择
请参阅node-formidable以获取完整选项列表
maxFields{Integer}限制查询字符串解析器将解码的字段数量,默认1000maxFieldsSize{Integer}限制所有字段(文件除外)可以分配的内存量(以字节为单位)。如果超过此值,则会发出“error”事件,默认2mb (2 * 1024 * 1024)uploadDir{String}设置文件上传的目录,默认os.tmpDir()keepExtensions{Boolean}写入的文件uploadDir将包含原始文件的扩展名,默认falsehashAlgorithm{String}如果要计算传入文件的校验和,请将其设置为'sha1'或'md5',默认falsemultiples{Boolean}多文件上传或不上传,默认trueonFileBegin{Function}文件开始时的特殊回调。此函数由 formidable 直接执行。它可用于在将文件保存到磁盘之前重命名文件。请参阅文档
使用总结
formidable配置文化上传
- multipart: true, // 支持文件上传(会挂载ctx.request.files)
- uploadDir 上传目录(不能使用相对路径,不会相对于当前路径,而是process.cwd()的执行路径)
- keepExtensions: true, // 保留文件扩展名
parsedMethods 默认只解析 ['POST', 'PUT', 'PATCH'] 需要单独配置,解析的数据会挂着到 body上
const path = require("path");
// app 业务拆分 koa
const Koa = require("koa");
const { koaBody } = require("koa-body");
const koaStatic = require("koa-static");
const KoaParameter = require("koa-parameter");
// const userRouter = require("../router/user.route");
const router = require("../router");const errHandler = require("./errHandler");const app = new Koa();// 解析body
app.use(koaBody({multipart: true, // 支持文件上传(会挂载ctx.request.files)// 文件上传配置formidable: {uploadDir: path.join(__dirname, "../upload"), // 上传目录(不能使用相对路径,不会相对于当前路径,而是process.cwd()的执行路径)keepExtensions: true, // 保留文件扩展名},parsedMethods: ["POST", "PUT", "PATCH", "DELETE"], // 只解析这些方法的body})
);
// 静态资源
app.use(koaStatic(path.join(__dirname, "../upload")));
// 参数校验
app.use(KoaParameter(app));
// 注册路由 routes方法返回一个中间件注册所有的 (allowedMethods 处理404 500)
app.use(router.routes()).use(router.allowedMethods());// 监听错误
app.on("error", errHandler);module.exports = app;
相关文章:
koa-body 的详细使用文档
目录 koa-body install Features Hello World - Quickstart Usage with koa-router Usage with unsupported text body type Options 关于 parsedMethods 的说明 文件支持 关于未解析请求主体的说明 一些强大的选择 使用总结 koa-body 功能齐全的 koa body 解析器中…...
信息系统与互联网中的安全、隐私及伦理问题
1 伦理(Ethics) 1.1 伦理框架(Ethical Frameworks) 自然法与权利(Natural Law and Rights) 定义:基于人类自然权利的伦理思想,强调生命、自由和财产等基本权利。应用:隐…...
Java安全—log4j日志FastJson序列化JNDI注入
前言 log4j和fastjson都是这几年比较火的组件,前者是用于日志输出后者则是用于数据转换,今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置,因为我们要引用第三方组件,而这些第三方组件都是…...
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN?2.2 CMSIS-NN是什么?2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…...
Python中如何判断一串文本是不是数字
目录 1. 内置函数2. 尝试类型转换3. 正则表达式 在编程中,我们经常需要确定一段文本是否为数字。 这不仅关系到数据的准确性,还涉及到后续的计算和处理。 1. 内置函数 在Python中,可以使用str.isdigit()、str.isnumeric()和str.isdecimal()…...
基于YOLOv8深度学习的智慧农业山羊行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着智慧农业的快速发展,利用先进的技术手段对牲畜的行为进行自动化监测和管理,已经成为现代农业中的重要研究方向之一。在传统的农业管理模式中,牲畜的行为监测通常依赖于人工观测,耗时耗力且难以实现大规模实时监控。然而&#…...
Redis环境部署(主从模式、哨兵模式、集群模式)
一、概述 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库…...
高阶C语言之六:程序环境和预处理
本文介绍程序的环境,在Linux下对编译链接理解,较为简短,着重在于编译的步骤。 C的环境 在ANSI C(标准C语言)的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中,源代码…...
Vue 3 国际化 (i18n) 最佳实践指南
1. 安装依赖 npm install vue-i18n@9 2. 项目结构建议 src/ ├── i18n/ │ ├── index.ts # i18n 配置文件 │ ├── languages/ # 语言文件目录 │ │ ├── zh-CN.ts # 中文 │ │ ├── en-US.ts # 英文 │ │ └─…...
Acme PHP - Let‘s Encrypt
Lets Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书: Acme PHP | Rob…...
获取DOM 节点的四大方式
前言: 在 Vue 中,获取 DOM 节点可以通过多种方式,如自定义属性、ref 引用、类选择器和 ID 选择器等。 一、使用 ref 获取 DOM 实例 ref 是 Vue 中推荐的获取 DOM 节点的方式,它为每个节点分配一个唯一的引用,可以直…...
ROS2 Humble 机器人建模和Gazebo仿真
一.Ubuntu22.04系统虚拟机安装 1.下载镜像并安装 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.安装选英文版,安装类型选清除磁盘。 3.遇到无法复制windows内容到虚拟机里。需安装VMware tools。VMware tools安装不了&a…...
docker容器镜像的制作、使用以及传递
目录 制作容器镜像使用Dockerfile制作镜像准备所需文件构建镜像怎么不使用基础镜像来构建容器镜像 使用容器镜像传递容器镜像 这篇文章讨论一下怎么使用docker制作容器镜像,容器镜像的使用,以及怎么传递容器镜像。 制作容器镜像 docker制作容器镜像推荐…...
一种由于吸入硅酸盐粉尘而引起的肺部疾病:pneumonoultramicroscopicsilicovolcanoconiosis
有人说,pneumonoultramicroscopicsilicovolcanoconiosis是英语中最长的单词,这是一个医学词汇,意思是指:一种由于吸入硅酸盐粉尘而引起的肺部疾病。 pneumonoultramicroscopicsilicovolcanoconiosis [ˈnju:mənəuˌʌltrəˌmai…...
百度AI人脸检测与对比
1.注册账号 打开网站 https://ai.baidu.com/ ,注册百度账号并登录 2.创建应用 3.技术文档 https://ai.baidu.com/ai-doc/FACE/yk37c1u4t 4.Spring Boot简单集成测试 pom.xml 配置: <!--百度AI--> <dependency> <groupId>com.baidu.…...
贴代码框架PasteForm特性介绍之outer,outers,object,objects,outerdisplay
简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…...
sql数据库-权限控制-DCL
目录 常用权限类别 查询用户权限 举例 授予用户权限 删除权限 常用权限类别 权限说明ALL,ALL PRIVILEGES所有权限SELECT查询数据INSERT插入数据UPDATE修改数据DELETE删除数据ALTER修改表DROP删除数据库/表/视图CREATE创建数据库/表 查询用户权限 show grants for 用户名…...
【计组笔记】目录
【计组笔记】机器数表示及运算https://blog.csdn.net/Resurgence03/article/details/142673325?sharetypeblog&shareId142673325&sharereferAPP&sharesourceresurgence03&sharefromlink 【计组笔记】指令系统https://blog.csdn.net/Resurgence03/article/det…...
深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器
在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,…...
AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台
AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大,也被企业广泛采用,然后也存着在诸如学习曲线陡峭,上手难度大&#x…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...
