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-alive

Request 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 body
  ctx.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-alive

Request 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、、HEADDELETE请求没有为请求正文定义语义,但这并不意味着它们在某些用例中可能无效。
  • koa-body 默认是严格的,只解析POSTPUTPATCH请求
  • 您可以使用枚举或字符串来选择要解析的方法:例如,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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

window的wsl(Ubuntu)安装kafka步骤

环境&#xff1a;Win11 WSL(Linux子系统Ubuntu) apache-zookeeper-3.9.3-bin kafka_2.12-3.8.1 思路&#xff1a;apache上分别下载zookeeper和kafka&#xff0c;在wsl环境安装。在kafka上创建消息的topic&#xff0c;发送消息&#xff0c;接受消息&#xff0c;验证是否安…

Notepad++--在开头快速添加行号

原文网址&#xff1a;Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键&#xff0c;从首行选中首列下拉&#xff0c;选中需要添加序号的所有行的首列&#xff…

机器学习基础06_梯度下降

目录 一、为什么使用梯度下降 二、什么是梯度下降 三、为什么要用梯度下降 四、怎么进行梯度下降 1、微分 1.单变量的微分 2.多变量的微分 2、梯度 3、步骤 (1)学习率α (2)梯度(导数)前的负号 4、实例实现 五、sklearn梯度下降 一、为什么使用梯度下降 前面利用正…

《Vue零基础入门教程》第二课:搭建开发环境

往期内容&#xff1a; 《Vue零基础入门教程》第一课&#xff1a;Vue简介 1 搭建开发环境 Vue环境分为两种 不使用构建工具使用构建丁具 首先&#xff0c;我们会介绍 不使用构建工具 的环境,在组件化章节中介绍 使用构建工具 的方式 1) 初始化 使用如下指令初始化 npm i…

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…

【Linux清空显存占用】Linux 系统中清理 GPU 显存

操作指令 # 查看NVIDIA GPU状态和进程 nvidia-smi # 查找所有包含"python"的进程 ps -ef grep python # 强制结束进程号为3023的进程 kill -9 3023截图演示 在 Linux 系统中清理 GPU 显存可以采用以下方法&#xff1a; 1. 终止特定进程&#xff08;常用方法&#x…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

IC脚本之perl

Perl 是一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上。IC flow 的 流传的古老版本大多是也是使用这种语言&#xff0c;这里会对Perl的常用知识点进行总结。 Note: 所有的语句必须以 “ &#xff1b;”结尾&#xff1b;所有的数据必须先定义才可以使…

MEMS硅麦克风应用电子烟雾化产业稳步爬升,耐高温、 防油、防酸、防腐蚀等性能优势和可实现自动化贴片及极高的一致性等特性使其必将成为主流

全球范围内&#xff0c;电子烟行业正处于快速发展的阶段。随着消费者健康意识的提升和对传统烟草制品替代品需求的增加&#xff0c;电子烟市场获得了显著的增长。然而&#xff0c;伴随而来的监管挑战和消费者期待的变化&#xff0c;也促使行业不断进行技术创新和产品优化。特别…

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证&#xff08;Two-Factor Authentication&#xff0c;简称2FA&#xff09;是一种身份验证机制&#xff0c;它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的&#xff08;如密码&#xff09;、用户所拥有的&#xff08;如…

快慢指针应用---环型链表的应用

1.题目--判断链表是否成环 已经了解了快慢指针的应用原理&#xff0c;引申&#xff1a;用快慢指针去判断链表是否成环。 题解 简而言之&#xff0c;在fast和slow指针遍历的这种情况下&#xff0c;如果链表是成环的&#xff0c;那么在循环遍历了两次后&#xff0c;fast指针就会…

三、计算机视觉_06YOLO基础知识

1、YOLO概述 1.1 定义 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的对象检测和图像分割模型&#xff0c;由华盛顿大学的 Joseph Redmon 和 Ali Farhadi 于 2015 年推出&#xff0c;因其高速和准确性而迅速受到欢迎 在目标检测领域&#xff0c;传统方法&…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析&#xff1a;选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具&#xff0c;涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…

【Spring Boot】用 MyBatis 实现数据的 CRUD

用 MyBatis 实现数据的 CRUD 1.创建项目 & 引入依赖2.实现数据表的自动初始化3.实现实体对象建模4.实现实体和数据表的映射关系5.实现增加、删除、修改和查询功能6.配置分页功能6.1 增加分页支持6.2 创建分页配置类 7.实现分页控制器8.创建分页视图 本篇博客将通过 MyBatis…

数据结构-二叉树_堆

目录 1.二叉树的概念 ​编辑1.1树的概念与结构 1.2树的相关语 1.3 树的表示 2. ⼆叉树 2.1 概念与结构 2.2 特殊的⼆叉树 2.2.2 完全⼆叉树 2.3 ⼆叉树存储结构 2.3.1 顺序结构 2.3.2 链式结构 3. 实现顺序结构⼆叉树 3.2 堆的实现 3.2.2 向下调整算法 1.二叉树的概…

独家原创 | SCI 1区 高创新预测模型!

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问题…

Arcgis 地图制作

地图如下,不同历史时期&#xff1a;

【K8S系列】Kubernetes 中如何调试imagePullSecrets配置详细步骤介绍

调试 imagePullSecrets 配置是确保 Kubernetes 能够成功拉取私有镜像所需的关键步骤。以下是详细的调试步骤和建议。 1. 确认 imagePullSecrets 配置 首先&#xff0c;确保在 Pod 的 YAML 配置中正确引用了 imagePullSecrets。其基本结构如下&#xff1a; apiVersion: v1 kin…