1.當(dāng)有多個Query參數(shù)時可以定義成對象, ApiQuery的type值設(shè)定為該對象類型占调。例如:
// xxx.dto.ts
export class QueryUserDto {
@ApiProperty({ description: '用戶姓名' })
@IsString()
@IsOptional()
name: string
@ApiProperty({ description: 'limit, 默認為20' })
@Type(() => Number)
@IsNumber()
@IsOptional()
@Min(10)
@Max(200)
limit: number
@ApiProperty({ description: 'offset, 默認為0' })
@Type(() => Number)
@IsNumber()
@IsOptional()
@Min(0)
offset: number
}
// xxx.controller.ts
@ApiQuery({
type: QueryUserDto
})
- 好像Query參數(shù)不會自動轉(zhuǎn)類型(我的項目中是這樣的,不知道是設(shè)定問題還是BUG,需要手動添加Pipe坡倔,當(dāng)Query參數(shù)使用Class定義時很不方便)這時我們可以自己定義一個Pipe,使用
plainToClass
將對象轉(zhuǎn)成對應(yīng)的類型脖含。
// parse-query.pipe.ts
import type { ArgumentMetadata, PipeTransform } from '@nestjs/common'
import { Injectable } from '@nestjs/common'
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
import { ClassConstructor, plainToClass } from 'class-transformer'
@Injectable()
export class ParseQueryPipe implements PipeTransform<string> {
async transform(value: any, { metatype }: ArgumentMetadata) {
const obj = plainToClass(metatype as ClassConstructor<any>, value)
console.log('metatype ---> ', metatype)
return obj
}
}
使用方法:
@Query(new ParseQueryPipe()) queryUserDto: QueryUserDto
- controller返回值統(tǒng)一使用固定的結(jié)構(gòu)時罪塔,生成swagger文檔可以參考https://docs.nestjs.com/openapi/operations#advanced-generic-apiresponse,使用泛型的方式器赞。
class BaseResponse<T> {
data: T
status: number
message: string
}