nest使用中,除了在DTO
中使用class-validator
去做校验。
还可以去写swagger
文档。
在nest
的controller
写法中,代码如下
//person.controller.ts
@Post()
async create(@Body() person: PersonDTO): Promise {
return ....
}
SwaggerModule
会查找到@Body
这个装饰器来生成API
文档。同样的装饰器还有@Query
,@Param
。至于详尽的api说明都是从PersonDTO
中解析出来。
可以查阅中文文档链接
下面是一些常用的装饰器
ApiProperty
参数说明
- type 类型
- required 是否必须
- description 描述
- default 默认值
- name 属性名称,默认是装饰器修饰的属性名,但是显性的设置name文档中按照这个name的value为最终输入值
type
DTO的写法
class PersonDTO {
name: string;
app: number; //或者
links: string[]// 数组
}
这是ts的写法
而ApiProperty支持的Type
有String
,Number
,Function
,以及数组[String]
数组的写法就是这样,一定要在type属性声明为[type]
或者设置isArray
属性为true
ApiBody
TypeScript 不会存储有关泛型或接口的元数据.
需要使用ApiBody
显性设置类型。
对于没用参数装饰器三兄弟的,又需要写文档的,就用ApiBody制定一个DTO
@ApiBody({ type: [CreateUserDto] })
createBulk(@Body() usersDto: CreateUserDto[])
设置可选 ApiPropertyOptional
ApiProperty
默认是必填的,如果期望是选填的。
可以使用ApiPropertyOptional
来代替。可以不需要去{required: false}
了
ApiPropertyOptional
其它参数参考ApiProperty
.
返回可选的装饰器 PartialType()
对于create
操作,所有的参数可能都是必填。
而对于update
操作,只需要更新部分操作。
通过PartialType
可以返回一个所有输入都是可选的参数
export class UpdatePersonDto extends PartialType(CreatePersonDto) {}
在更新的Controller
使用这个CreatePersonDto
就可以了。
我在写本地demo的时候,发现PartialType在@nest/swagger下不存在。如果你也有这个问题,需要升级swagger这个包。~~~~
PickType()
功能从一个输入类型中选择一部分属性来创建一个新类型(类)
重点是选择一部分
class PersonDTO {
@ApiProperty({
message: '',
type: String,
})
name: string;
@ApiProperty({
message: '',
type: String,
})
hintText: string;
...
}
我们只需要hintText
与name
只需要这么写
class updateDTO extends PickType(PersonDTO,['name','hintText']){}
updateDTO
只有name
与hintText
两个属性。
PickType
显然很有用
OmitType
OmitType
与PickType
功能是相反的,写法也一样。
移除指定的输入属性。
IntersectionType
IntersectionType()
函数将两种类型组合成一个新类型.
export class UpdateCatDto extends IntersectionType(CreateCatDto, AdditionalCatInfo) {}
注意是将两种输入类变成一个输入类,把两个类的所有属性合并为一个类
PartialType
是类的所有成员全部变成可选的。PickType
对指定输入类选择指定的成员并返回一个类。OmitType
对指定输入类排除指定的成员并返回一个类。IntersectionType
是合并两个输入类,合并所有成员。
更强的组合写法
函数类映射是支持组合的写法的。
export class UpdateCatDto extends PartialType( OmitType(CreateCatDto, ['name'] as const), ) {}
常用的枚举类型
在ts
中有一个枚举类型为enum
.
在日常的业务中,常有一些业务类型的判断。
如以下场景 ,porductType
,1对应类型A,2对应类型B,未来会继续拓展。
我们在代码中如果直接判断vlaue,维护起来就会难以理解
if(data.porductType === 1) {
dosomething
}else {
其它产品
}
此时引入一个枚举就很适用
enum prodcTypeEnum {
typeA = '1',
typeB = '2',
...
}
业务代码判断类型就成为了如下的形式
if( data.type === prodcTypeEnum[typeA]){
}
枚举在业务中很常见,某个字段局限于确定的几个值,这便是枚举的使用场景.
设置ApiProperty
类型为具体的数组值。如果被装饰的字段是数组,还需要设置IsArray
为true
.
class User {
@ApiProperty({
enum: ['Admin','SuperAdmin','User'],
isArray: true,
})
role: UserRole;
}
enum UserRole {
Admin = `Admin`,
SuperAdmin = `SuperAdmin`,
...
}