# @zenweb/body - AI Reference

## Setup

```typescript
import body from '@zenweb/body';
$initCore().setup(body(options)).start();
```

## BodyOption

| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| encoding | string | 'utf-8' | 默认编码 |
| limit | number | 1048576 | 大小限制 (bytes) |
| inflate | boolean | true | 支持 gzip/deflate |
| textTypes | string[] | ['text/*', 'xml', '+xml'] | 文本类型 |
| parses | BodyParserClass[] | [JSONParser, URLEncodedParser] | 解析器 |

## Injectable Classes

| 类 | 作用域 | 属性/说明 |
|----|--------|-----------|
| RawBody | request | `data?: Buffer` - 原始数据(已解压) |
| TextBody | request | `data?: string` - 解码后文本 |
| Body | request | `data?: unknown`, `type?: string`, `parser?: BodyParser` |
| ObjectBody | request | 对象形式，仅限 JSON/urlencoded |
| BodyHelper | request | 继承 HelperBase，`input: ObjectBody` |

## Global Functions

```typescript
await $getRawBody()    // => Buffer | undefined
await $getTextBody()   // => string | undefined
await $getObjectBody() // => ObjectBody
$body                  // BodyHelper 代理
```

## Parser Classes (singleton)

| 类 | objected | types | 说明 |
|----|----------|-------|------|
| BodyParser | abstract | abstract | 基类 |
| TextBodyParser | abstract | abstract | 接收解码后字符串 |
| RawBodyParser | abstract | abstract | 接收原始 Buffer |
| JSONParser | true | ['json', '+json'] | JSON 解析 |
| URLEncodedParser | true | ['urlencoded'] | 表单解析 |

### 自定义解析器

```typescript
@Injectable('singleton')
export class XMLParser extends TextBodyParser {
  objected = false;
  types = ['xml', '+xml'];
  parse(text: string) { return parseXML(text); }
}

// 注册
.setup(body({ parses: [JSONParser, URLEncodedParser, XMLParser] }))
```

## Middleware

```typescript
router.post('/api', useBodyParser(JSONParser), handler);
```

## Error Types

| 状态码 | type | 说明 |
|--------|------|------|
| 400 | json.parse-error | JSON 解析失败 |
| 400 | decode.failed | 编码转换失败 |
| 400 | objected.only | 非对象格式转 ObjectBody |
| 400 | request.aborted | 请求中断 |
| 400 | request.size.invalid | 长度不匹配 |
| 413 | entity.too.large | 超过大小限制 |
| 415 | json.strict | JSON 必须是对象/数组 |
| 415 | charset.unsupported | 不支持的编码 |
| 415 | encoding.unsupported | 不支持的压缩格式 |
| 500 | stream.not.readable | 流不可读 |