跳到主要内容

装饰器概览

什么是装饰器?​

express-cargo 中的装饰器用于标注类字段,告诉中间件:

  • 从哪里提取数据(例如 body、query)
  • 如何验证数据
  • 如何转换数据

当你将一个类传给 bindingCargo 时,中间件会读取这些装饰器,构建、验证并转换出一个类型安全的对象,你可以通过 getCargo 获取它。

装饰器分类​

装饰器按照它们在绑定流程中所扮演的角色进行分组。

分类用途示例参考
来源选择字段值的来源@Body、@Query、@Header、@Uri / @Params、@Session、@UploadedFile、@UploadedFiles来源装饰器、文件上传装饰器
请求直接从 Express 的 Request 读取值@Request虚拟字段装饰器
虚拟从对象的其他字段计算出字段@Virtual虚拟字段装饰器
转换在绑定前修改单个字段的值@Transform转换装饰器
类型助手决定原始值如何被解释和转换@Type、@List、@Enum类型助手装饰器
验证对字段值强制执行规则@Min、@Max、@Email、@OneOf、…验证装饰器
缺失值决定字段缺失时的处理方式@Default、@Optional处理缺失字段

来源、请求 和 虚拟 回答的是同一个问题——这个字段的值从哪里来——因此每个字段必须且只能带其中一个,不能混用。@UploadedFile 和 @UploadedFiles 是读取 multipart 解析器输出的来源装饰器,所以在同一个字段上同时使用 @UploadedFile 和 @Body,会像 @Body 与 @Query 一样被拒绝。

@Type 和 @List 更深入的场景——多态、循环引用、自定义类的数组——请参见 进阶用法 中的 类型转换与多态 和 List 装饰器。

组合使用装饰器​

单个字段可以同时携带来自多个分类的装饰器。它们会被一起读取,用于绑定、转换和验证该字段:

import { Body, Transform, MinLength } from 'express-cargo'

class CreateUserRequest {
@Body('email') // 来源:从 req.body.email 读取
@Transform((value: string) => value.trim()) // 转换:规范化值
@MinLength(5) // 验证:强制执行规则
email!: string
}

限制发生在同一分类内部,而不是跨分类:一个字段只能有一个来源、一个类型助手和一种缺失值策略,而验证装饰器可以自由叠加。bindingCargo() 会在注册路由时检查这些规则,并在服务器处理请求之前抛出 CargoSchemaError。

上面链接的每个分类都有各自的文档页面。