alioth/before/cha/11=initkoa/test/koa-body使用.md
2025-05-30 09:18:01 +08:00

287 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

`koa-body` 是一个流行的 Koa 请求体解析中间件,支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。下面是 `koa-body` 的详细配置和使用方式:
## 安装
使用 npm 安装 `koa-body` 中间件:
```
npm install koa-body --save
```
## 使用
要使用 `koa-body` 中间件,只需要在 Koa 应用程序中使用 `app.use` 方法将其注册,然后可以在请求处理程序和中间件中使用 `ctx.request.body` 来访问已解析的请求体数据。
以下是一个使用 `koa-body` 中间件的示例:
```javascript
const Koa = require('koa');
const koaBody = require('koa-body');
const app = new Koa();
// 将 koaBody 中间件注册到应用程序中
app.use(
koaBody({
multipart: true,
formidable: {
maxFileSize: 100 * 1024 * 1024,
},
})
);
// 处理请求
app.use((ctx) => {
// 访问已解析的请求体数据
console.log(ctx.request.body);
ctx.body = 'Hello Koa';
});
// 启动应用程序
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
```
在上面的示例中,我们将 `koa-body` 中间件注册到应用程序中,并通过参数对象配置解析器。其中,`multipart` 选项是用于启用文件上传支持的选项,`formidable` 对象包括有关文件上传的配置选项,例如 `maxFileSize`,用于限制文件的大小。
在请求处理程序中,我们可以使用 `ctx.request.body` 访问已解析的请求体数据。
## 配置选项
下面是 `koa-body` 可用的配置选项及其默认值:
- `form`:是否解析 `application/x-www-form-urlencoded` 格式的请求体数据,默认为 `true`
- `json`:是否解析 `application/json` 格式的请求体数据,默认为 `true`
- `text`:是否解析 `text/*` 格式的请求体数据,默认为 `true`
- `encoding`:请求体的编码方式,默认为 `'utf-8'`
- `xml`:是否解析 `application/xml``text/xml` 格式的请求体数据,默认为 `false`
- `jsonLimit`:限制解析 `application/json` 格式请求体数据的大小(以字节为单位),默认为 `1mb`
- `formLimit`:限制解析 `application/x-www-form-urlencoded` 格式的请求体数据大小(以字节为单位),默认为 `56kb`
- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb`
- `xmlLimit`:限制解析 `application/xml``text/xml` 格式的请求体数据大小(以字节为单位),默认为 `1mb`
- `multipart`:是否解析 `multipart/*` 格式的请求体数据(用于文件上传),默认为 `false`
- `multiples`:是否解析多个文件上传,默认为 `false`
- `onError`:错误处理程序,用于处理请求体解析错误,默认为 `ctx.throw`
- `includeUnparsed`:是否将未解析的请求体数据存储在 `ctx.request.body` 中,默认为 `false`
- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb`
## 示例
### 解析表单数据和 JSON 数据
以下示例演示如何将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据:
```javascript
const Koa = require('koa');
const koaBody = require('koa-body');
const app = new Koa();
// 仅解析表单数据和 JSON 数据
app.use(koaBody({ form: true, json: true }));
app.use((ctx) => {
console.log(ctx.request.body);
ctx.body = 'Hello Koa';
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
```
在上面的示例中,我们将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据。我们可以在请求处理程序中使用 `ctx.request.body` 访问已解析的请求体数据。
### 解析文件上传
以下示例演示如何使用 `koa-body` 中间件解析文件上传:
```javascript
const Koa = require('koa');
const koaBody = require('koa-body');
const app = new Koa();
// 启用文件上传支持
app.use(
koaBody({
multipart: true,
formidable: {
maxFileSize: 100 * 1024 * 1024,
},
})
);
app.use((ctx) => {
// 文件上传信息存储在 ctx.request.files 中
console.log(ctx.request.files);
ctx.body = 'Hello Koa';
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
```
在上面的示例中,我们将 `koa-body` 中间件配置为启用文件上传支持,并使用 `formidable` 对象配置文件上传选项。在请求处理程序中,我们可以使用 `ctx.request.files` 访问文件上传信息。
### 错误处理
`koa-body` 中间件的默认错误处理程序是 `ctx.throw`,它会抛出一个 HTTP 400 错误响应。你可以自定义一个错误处理程序来处理请求体解析错误。
以下示例演示如何自定义错误处理程序:
```javascript
const Koa = require('koa');
const koaBody = require('koa-body');
const app = new Koa();
app.use(
koaBody({
onError: (err, ctx) => {
ctx.throw('Body parse error', 422);
},
})
);
app.use((ctx) => {
console.log(ctx.request.body);
ctx.body = 'Hello Koa';
});
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
```
在上面的示例中,我们自定义了一个错误处理程序,当发生请求体解析错误时,它会抛出一个 HTTP 422 错误响应。
## 总结
`koa-body` 是一个流行的 Koa 请求体解析中间件,它支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。你可以通过配置选项来自定义解析器的行为,并使用 `ctx.request.body``ctx.request.files` 在请求处理程序中访问已解析的请求体数据和上传的文件信息。同时,你也可以自定义错误处理程序来处理请求体解析错误。
一、需求
之前使用 koa2 的时候,处理 post 请求使用的是 koa-bodyparser同时如果是图片上传使用的是 koa-multer。
这两者的组合没什么问题,不过 koa-multer 和 koa-route注意不是 koa-router 存在不兼容的问题。
这个问题已经在这篇文章中说明了:
使用koa-multer实现文件上传并自定义文件名和目录
关于 koa-bodyparser 的使用,见下面文章:
手动实现koa2 body-parser中间件及koa-boayparser的使用
但是这两者可以通过 koa-body 代替,并且只是用 koa-body 即可。
koa-body 主要是下面两个依赖:
"co-body": "^5.1.1",
"formidable": "^1.1.1"
具体的实现可以在 github 上查看 https://github.com/dlau/koa-body
二、koa-body 的基本使用
在 koa2 中使用 koa-body,我使用的是全局引入,而不是路由级别的引入,因为考虑到很多地方都有 post 请求或者是文件上传请求,没必要只在路由级别引入。
1、安装依赖
yarn add koa-body
## npm i koa-body -S
2、app.js
省略了 koa 的一些基本代码
const koaBody = require('koa-body');
const app = new koa();
app.use(koaBody({
multipart:true, // 支持文件上传
encoding:'gzip',
formidable:{
uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录
keepExtensions: true, // 保持文件的后缀
maxFieldsSize:2 * 1024 * 1024, // 文件上传大小
onFileBegin:(name,file) => { // 文件上传前的设置
// console.log(`name: ${name}`);
// console.log(file);
},
}
}));
3、有用的参数
1koa-body 的基本参数
参数名 描述 类型 默认值
patchNode 将请求体打到原生 node.js 的ctx.req中 Boolean false
patchKoa 将请求体打到 koa 的 ctx.request 中 Boolean true
jsonLimit JSON 数据体的大小限制 String / Integer 1mb
formLimit 限制表单请求体的大小 String / Integer 56kb
textLimit 限制 text body 的大小 String / Integer 56kb
encoding 表单的默认编码 String utf-8
multipart 是否支持 multipart-formdate 的表单 Boolean false
urlencoded 是否支持 urlencoded 的表单 Boolean true
text 是否解析 text/plain 的表单 Boolean true
json 是否解析 json 请求体 Boolean true
jsonStrict 是否使用 json 严格模式true 会只处理数组和对象 Boolean true
formidable 配置更多的关于 multipart 的选项 Object {}
onError 错误处理 Function function(){}
stict 严格模式,启用后不会解析 GET, HEAD, DELETE 请求 Boolean true
2formidable 的相关配置参数
参数名 描述 类型 默认值
maxFields 限制字段的数量 Integer 1000
maxFieldsSize 限制字段的最大大小 Integer 2 * 1024 * 1024
uploadDir 文件上传的文件夹 String os.tmpDir()
keepExtensions 保留原来的文件后缀 Boolean false
hash 如果要计算文件的 hash则可以选择 md5/sha1 String false
multipart 是否支持多文件上传 Boolean true
onFileBegin 文件上传前的一些设置操作 Function function(name,file){}
关于 onFileBegin 的更多信息可以查看:
https://github.com/felixge/node-formidable#filebegin
4、获取文件上传后的信息
这些代码是在路由中体现的
需要注意的是,如果是获取上传后文件的信息,则需要在 ctx.request.files 中获取。
如果是获取其他的表单字段,则需要在 ctx.request.body 中获取,这是由 co-body 决定的(默认情况)。
router.get('/', async (ctx) => {
await ctx.render('index');
});
router.post('/',async (ctx)=>{
console.log(ctx.request.files);
console.log(ctx.request.body);
ctx.body = JSON.stringify(ctx.request.files);
});
三、结果
因为默认开启多个文件上传,因此 ctx.request.files 是一个对象,
而且是通过表单的 name=photo 属性作为对象的 key,值便是一个 File 对象,有用的字段如下:
字段名 描述
size 文件大小
path 文件上传后的目录
name 文件的原始名称
type 文件类型
lastModifiedDate 上次更新的时间
http://www.ptbird.cn/koa-body.html
————————————————
版权声明本文为CSDN博主「after you」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。
原文链接https://blog.csdn.net/gwdgwd123/article/details/103561817