@zenweb/body - 请求内容解析
zenweb 模块 - 解析 HTTP POST 请求内容(JSON、表单、文本、二进制等)
安装
npm install @zenweb/body
快速开始
import { Context, Post, Body, ObjectBody, BodyHelper, $body } from 'zenweb';
export class Controller {
@Post()
post(body: Body) {
console.log(body.type);
console.log(body.data);
}
@Post()
form(obj: ObjectBody) {
console.log(obj.name, obj.age);
}
@Post()
async validate(helper: BodyHelper) {
const { name, age } = await helper.get({
name: 'string',
age: '!int',
});
}
}
async function outsideDI() {
const data = await $body.data();
const { name } = await $body.get({ name: 'string' });
}
解析流程
- RawBody - 读取原始数据流,处理 gzip/deflate 解压
- TextBody - 按字符集编码转换为文本(如 UTF-8、GBK)
- Body - 根据 Content-Type 选择解析器,返回解析结果
- ObjectBody - 将 Body.data 转为对象形式(仅 JSON/表单)
可注入对象
| RawBody | request | 原始 Buffer,已解压 |
| TextBody | request | 解码后的文本字符串 |
| Body | request | 解析后的数据,含 type、parser 属性 |
| ObjectBody | request | 对象形式,仅支持 JSON 和表单 |
| BodyHelper | request | 类型转换与校验,继承 @zenweb/helper |
全局函数
在非注入上下文中通过 AsyncLocalStorage 访问:
await $getRawBody()
await $getTextBody()
await $getObjectBody()
$body
配置项
| encoding | string | 'utf-8' | 默认字符集编码 |
| limit | number | 1048576 | 内容大小限制 (bytes),默认 1MB |
| inflate | boolean | true | 支持 gzip/deflate 压缩传输 |
| textTypes | string[] | ['text/*', 'xml', '+xml'] | 文本类型匹配规则 |
| parses | BodyParserClass[] | [JSONParser, URLEncodedParser] | 解析器列表 |
自定义解析器
import { Injectable } from '@zenweb/inject';
import body, { TextBodyParser, JSONParser, URLEncodedParser } from '@zenweb/body';
@Injectable('singleton')
export class XMLParser extends TextBodyParser {
objected = false;
types = ['xml', '+xml'];
parse(text: string) {
return parseXML(text);
}
}
$initCore().setup(body({
parses: [JSONParser, URLEncodedParser, XMLParser]
}));
指定解析器
强制使用特定解析器处理请求:
import { useBodyParser, JSONParser } from '@zenweb/body';
router.post('/api', useBodyParser(JSONParser), handler);
错误类型
模块抛出 http-errors,包含 type 字段:
| 400 | json.parse-error | JSON 解析失败 |
| 400 | decode.failed | 编码转换失败 |
| 400 | objected.only | 非 JSON/表单格式转 ObjectBody |
| 413 | entity.too.large | 超过大小限制 |
| 415 | json.strict | JSON 必须是对象或数组 |
| 415 | charset.unsupported | 不支持的字符集 |
扩展模块