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
,默认false
patchKoa
{Boolean}将请求体补丁为 Koa 的ctx.request
,默认true
jsonLimit
{String|Integer} JSON 主体的字节(如果为整数)限制,默认1mb
formLimit
{String|Integer}表单主体的字节(如果为整数)限制,默认56kb
textLimit
{String|Integer}文本主体的字节(如果为整数)限制,默认56kb
encoding
{String}设置传入表单字段的编码,默认utf-8
multipart
{Boolean}解析multipart主体,默认false
urlencoded
{Boolean}解析 urlencoded 主体,默认true
text
{Boolean}解析文本主体,例如 XML,默认true
json
{Boolean}解析 JSON 主体,默认true
jsonStrict
{Boolean}切换 co-body 严格模式;如果设置为 true - 仅解析数组或对象,默认true
includeUnparsed
{Boolean}切换 co-body returnRawBody 选项;如果设置为 true,对于表单编码和 JSON 请求,将ctx.request.body
使用Symbol
(查看详细信息)附加原始未解析的请求正文,默认false
formidable
{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}限制查询字符串解析器将解码的字段数量,默认1000
maxFieldsSize
{Integer}限制所有字段(文件除外)可以分配的内存量(以字节为单位)。如果超过此值,则会发出“error”事件,默认2mb (2 * 1024 * 1024)
uploadDir
{String}设置文件上传的目录,默认os.tmpDir()
keepExtensions
{Boolean}写入的文件uploadDir
将包含原始文件的扩展名,默认false
hashAlgorithm
{String}如果要计算传入文件的校验和,请将其设置为'sha1'
或'md5'
,默认false
multiples
{Boolean}多文件上传或不上传,默认true
onFileBegin
{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…...
golang操作mysql基础驱动github.com/go-sql-driver/mysql使用
golang中类似java操作mysql的jdbc一样,github.com/go-sql-driver/mysql也为go提供了基础接口,在开发中往往需要写更多的代码来满足自己的定制需求,java在驱动基础上有了扩展,orm框架诞生,mybatis、jpa等都是好用的扩展…...
正则表达式完全指南,总结全面通俗易懂
目录 元字符 连接符 限定符 定位符 修饰符(标记) 运算符优先级 普通字符集及其替换 零宽断言 正向先行断言 负向先行断言 正向后发断言 负向后发断言 捕获组 普通捕获组 命名捕获组 PS:非捕获组 正则表达式在线测试: 正则在线测试工具 …...
运维面试题.云计算面试题之三ELK
1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…...
C# DataTable使用Linq查询详解
前奏- C# 对DataTable进行查询 C# 可以对 DataTable 进行查询。在 .NET 框架中,DataTable 类提供了几种方法来查询数据,包括 Select 方法和 AsEnumerable 扩展方法(在 System.Data.DataSetExtensions 命名空间中)。 使用 Select…...
【企业级分布式系统】ELK优化
文章目录 Elasticsearch作为日志存储时的优化优化ES索引设置优化线程池配置锁定内存,不让JVM使用Swap减少分片数、副本数 Elasticsearch作为日志存储时的优化 linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做…...
51单片机基础05 定时器
目录 一、为什么要定时器 二、定时器中断 1、定时器中断参数 2、定时器中断程序 3、定时器计数 一、为什么要定时器 前文提到,比如进行流水灯等操作,都是直接写了delay_ms这类操作。 但是在51单片机中,其一般就是靠双for进行的循环时延&…...
tdengine学习笔记实战-jdbc连接tdengine数据库
先上代码,里面有两种获取连接的方式,一个单例,一个连接池 package com.tdengine.utils;import com.alibaba.druid.pool.DruidDataSource;import java.sql.*; import java.util.Properties;public class TDConnectUtils {// 单例对象private …...
vue3项目执行npm install下载依赖报错问题排查方法
1、检查当前node与npm的版本 nodejs 和 npm 的版本是有适配的,具体可以看官网:nodejs 和 npm 的版本是有适配的 若是版本不兼容,修改node或者npm的版本即可,建议使用nvm版本管理工具,切换方便; 2、清除缓…...
【vue】项目迭代部署后 自动清除浏览器缓存
前言: vue项目打包部署上线后,因浏览器缓存问题,导致用户访问的依旧是上个迭代批次的旧资源,需要用户手动清除缓存才能更新至最新版本,影响用户体验。 解决方法: html根文件添加以下标签 <meta http-eq…...
Leetcode(滑动窗口习题思路总结,持续更新。。。)
讲解题目:长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target ,找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…...
江门网站建设套餐/高端网站建设哪个好
链表中倒数第k个节点题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依…...
wordpress 用户 权限/百度收录申请入口
1、系统管理1.1 连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码举例:例1:连接到本机上的MySQL。首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令"mysql –u root –p",回…...
网站seo优化要怎么做/企业宣传软文
抖音web view默认的body是黑色的背景,写代码的时候要替换下用自己的颜色 body {background: #fff; }...
青浦教育平台网站建设/什么是全网营销推广
每个程序猿,在接触到工作流的时候,都会有这么一个疑问——我用一般的方法能够实现,为什么还要用工作流?我以前也问过这个问题,只是如今略微有点明确了。别着急要答案,看过以下的样例,也许你也就…...
怎么制作网站上传视频/网页制作咨询公司
保证部分VLAN形成环路,其他VLAN通处理方法【条目标题】3026ef trunk端口环回受控功能未关闭影响所有用户上网问题【现象描述】组网为S8016(trunk)3026EF2016用户反馈S8016 1/0/0端口下带所有业务出现过中断;【告警信息】 %Jun 20 06:53:52 2004 s3026f DRV_NI/5/LOO…...
贵阳东方蜜蜂网站建设/1688自然排名怎么做好
大多数行业都免不了此类琐碎繁杂的工作,而他们却又占用很多时间、很容易让人产生厌倦心理。如果被迫耗在这些数据整理的事情上,工作效率自然难以提高。这时Python提供了一种解决的方法。只要第一次花点时间做好小工具,后期工作便可以一键完成…...