我使用 NestJS 作为后端,我的用例如下: 我希望将嵌套对象作为查询参数来过滤日期,但可能在多个字段上进行过滤。
网址示例 =
GET /contents?createdBy=1&createdAt[startDate]=1234&createdAt[endDate]=1235&updatedAt[startDate]=5678&updatedAt[endDate]=5679
这会产生这样的对象:
{
createdBy: 1;
createdAt: {
startDate: 1234;
endDate: 1235
};
updatedAt: {
startDate: 5678;
endDate: 5679;
}
}
以下是我目前的类型:
export default class DateFiltersInput {
@ApiProperty({ required: false })
@IsNumber()
@Expose()
@IsOptional()
startDate?: number | undefined;
@ApiProperty({ required: false })
@IsNumber()
@IsOptional()
endDate?: number | undefined;
}
export default class GetContentsQuery {
@ApiProperty({ required: false })
@IsNumber()
@IsOptional()
createdBy?: number
@ApiProperty({ required: false, type: DateFiltersInput })
@IsOptional()
@Type(() => DateFiltersInput)
@ValidateNested()
createdAt?: DateFiltersInput;
@ApiProperty({ required: false, type: DateFiltersInput })
@IsOptional()
@Type(() => DateFiltersInput)
@ValidateNested()
updatedAt?: DateFiltersInput;
}
我想要在 NestJS 中实现的目标是否可能?
从技术上讲,查询字符串就是一个字符串。因此 Swagger 始终将其表示为文本输入。如果您想传递对象结构,则必须使用请求的
body
,并且由于这是一个 GET
请求,我认为您不会这样做。
因此,您可以如何将过滤器作为查询字符串传递。
/**Fetch a list of content records.*/
@ApiQuery({
name: 'filter',
description: 'Filter json object',
})
public async getContents(
@Query('filter') filter?: string,
): Promise<GetContentsResponseDto> {
const filterDto = filter ? JSON.parse(filter) : null;
return this.contentService.getContents(filterDto);
}
将查询字符串作为字符串化(JSON.stringify)对象传递,并在控制器中进行 JSON.parse 。在 Swagger 中,您仍然会获得文本输入,但我使用一个网站:https://onlinejsontools.com/stringify-json,它可以帮助我快速对我复制并粘贴到 Swagger 中的对象进行字符串化,以快速测试我的端点。