我正在创建一个查询:@Query() query: AnalyticsRequestDTO<G>
用于我的GET端点,它包含一个DTO,如下所示:
export class AnalyticsRequestDTO<
G extends GroupableKeys,
P extends PopulateableKeys<G> | undefined = undefined
>
implements AggregateRunLogAnalyticsOptions<G, P>
{
@IsObject()
@IsOptional()
@ApiProperty({
description: 'Filters to apply logs',
required: false,
})
filter: AnalyticsFilterDTO = {}
@IsArray()
@ApiProperty({
description: 'The fields to group by',
required: false,
})
groupBy: G[]
@IsArray()
@IsOptional()
@ApiProperty({
description: 'The fields to populate',
type: [String],
required: false,
})
populate?: P[]
}
这里的问题是AnalyticsFilterDTO
正在扩散,就像你在下一张图片中看到的那样:
我想知道如何防止这种情况发生,因为正常的行为是发送 Package 在过滤器对象中的查询(即,{ filter:{ ruleId:“...”,appId:'..',... })。如果你按照斯瓦格的建议发送,它会失败。
下面是完整的控制器:
@Get('/app/:appId/pages')
@ApiOperation({
summary: 'Get rule statistics for all components in an application',
})
@ApiResponse({
description: 'Aggregated analytics',
type: AnalyticsResultsDTO,
status: HttpStatus.OK,
})
@HttpCode(HttpStatus.OK)
@ApiQuery({ type: AnalyticsRequestDTO })
public async getPageRuleStatistics<G extends GroupableKeys>(
@Param('appId', MongoIdPipe) applicationId: string,
@Query() query: AnalyticsRequestDTO<G>,
@Query('forceRebuild', new DefaultValuePipe(false), ParseBoolPipe)
forceRebuild = false
): Promise<AnalyticsResultsDTO<G>> {
const { filter, groupBy, populate } = query
// check groupBy
if (!AnalyticsController.isGroupableKeyArray(groupBy)) {
throw new BadRequestException(
'groupBy must be an array of groupable keys'
)
}
const runId = filter['runId']
if (runId) {
if (!isMongoId(runId))
throw new BadRequestException(`Invalid runId ${runId}`)
await this.analytics.buildRunLogAnalytics(runId, forceRebuild)
}
const analytics = await this.analytics.aggregateComponentAnalytics<G>(
applicationId,
'page',
{ filter, groupBy, populate }
)
return new AnalyticsResultsDTO(analytics)
}
这是正在传播的DTO:
export class AnalyticsFilterDTO {
@IsOptional()
@IsMongoId()
@ApiProperty({
type: String,
required: false,
})
runId?: string | Types.ObjectId
@IsOptional()
@IsMongoId()
@ApiProperty({
type: String,
required: false,
})
ruleId?: string | Types.ObjectId
@IsOptional()
@IsEnum(RuleType)
@ApiProperty({
enum: RuleType,
required: false,
})
ruleType?: RuleType
@IsOptional()
@IsUUID()
@ApiProperty({ required: false })
pageId?: string
@IsOptional()
@IsString()
@ApiProperty({ required: false })
componentId?: string
@IsOptional()
@IsEnum(PageComponentType)
@ApiProperty({
enum: PageComponentType,
required: false,
})
componentType?: PageComponentType
}
有什么预防方法吗?
1条答案
按热度按时间gt0wga4j1#
既然你使用dto作为查询,我认为它不可能有一个嵌套对象。
如果你在请求的主体中使用它,你可以设置属性类型,这将正确地显示所需的有效负载: