admin管理员组文章数量:1022220
I use: @UsePipes(new ValidationPipe({ transform: true }))
to transform query param criteria to specific types, but it doesn't work for numbers, can you explain me why?
Version of @bx/nestjs-commons - 9.4.0.
Not working version:
@Get()
@UsePipes(new ValidationPipe({ transform: true }))
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
mode: number[];
calculatedLength?: number;
}
Working version:
@Get()
@UsePipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
})
)
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
@ApiProperty({
type: [Number],
})
@IsOptional()
@Type(() => Number)
mode: number[];
@ApiProperty({
format: 'float',
})
calculatedLength?: number;
}
I use: @UsePipes(new ValidationPipe({ transform: true }))
to transform query param criteria to specific types, but it doesn't work for numbers, can you explain me why?
Version of @bx/nestjs-commons - 9.4.0.
Not working version:
@Get()
@UsePipes(new ValidationPipe({ transform: true }))
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
mode: number[];
calculatedLength?: number;
}
Working version:
@Get()
@UsePipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
})
)
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
@ApiProperty({
type: [Number],
})
@IsOptional()
@Type(() => Number)
mode: number[];
@ApiProperty({
format: 'float',
})
calculatedLength?: number;
}
Share
Improve this question
asked Nov 19, 2024 at 8:22
Paweł GrabowskiPaweł Grabowski
1
1 Answer
Reset to default 0In the second version, the following changes ensure proper transformation:
transformOptions: { enableImplicitConversion: true }
This option allows ValidationPipe to implicitly convert types based on the destination type in the DTO or class. In this case, it converts strings to numbers or arrays of numbers without needing explicit @Type decorators. Documentation: ValidationPipe Options - transformOptions
Decorators like @Type(() => Number):
This explicitly tells class-transformer how to convert incoming query parameters to the intended type, making sure that arrays like ['1', '2'] is converted to [1, 2]. Documentation: @Type Decorator - class-transformer
But the first example by default the enableImplicitConversion is set to false and this prevent the convertion of the param criteria
I use: @UsePipes(new ValidationPipe({ transform: true }))
to transform query param criteria to specific types, but it doesn't work for numbers, can you explain me why?
Version of @bx/nestjs-commons - 9.4.0.
Not working version:
@Get()
@UsePipes(new ValidationPipe({ transform: true }))
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
mode: number[];
calculatedLength?: number;
}
Working version:
@Get()
@UsePipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
})
)
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
@ApiProperty({
type: [Number],
})
@IsOptional()
@Type(() => Number)
mode: number[];
@ApiProperty({
format: 'float',
})
calculatedLength?: number;
}
I use: @UsePipes(new ValidationPipe({ transform: true }))
to transform query param criteria to specific types, but it doesn't work for numbers, can you explain me why?
Version of @bx/nestjs-commons - 9.4.0.
Not working version:
@Get()
@UsePipes(new ValidationPipe({ transform: true }))
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
mode: number[];
calculatedLength?: number;
}
Working version:
@Get()
@UsePipes(
new ValidationPipe({
transform: true,
transformOptions: {
enableImplicitConversion: true,
},
})
)
@ApiPageableParams()
@ApiPagedResponse(DeliveryReadModel)
@ApiCriteriaParams(new DeliveryListCriteria().criteriaMapping)
async getDelivery(
@AuthUser() userDetails: UserDetails,
@Query() criteria: DeliveryListCriteria,
@Query() pageable: Pageable
): Promise<PagedModel<DeliveryReadModel>> {
return this.deliveryService.get(
criteria,
pageable
);
}
export class DeliveryListCriteria {
@ApiProperty({
type: [Number],
})
@IsOptional()
@Type(() => Number)
mode: number[];
@ApiProperty({
format: 'float',
})
calculatedLength?: number;
}
Share
Improve this question
asked Nov 19, 2024 at 8:22
Paweł GrabowskiPaweł Grabowski
1
1 Answer
Reset to default 0In the second version, the following changes ensure proper transformation:
transformOptions: { enableImplicitConversion: true }
This option allows ValidationPipe to implicitly convert types based on the destination type in the DTO or class. In this case, it converts strings to numbers or arrays of numbers without needing explicit @Type decorators. Documentation: ValidationPipe Options - transformOptions
Decorators like @Type(() => Number):
This explicitly tells class-transformer how to convert incoming query parameters to the intended type, making sure that arrays like ['1', '2'] is converted to [1, 2]. Documentation: @Type Decorator - class-transformer
But the first example by default the enableImplicitConversion is set to false and this prevent the convertion of the param criteria
本文标签: validationValidationPipe doesn39t transform string to numberStack Overflow
版权声明:本文标题:validation - ValidationPipe doesn't transform string to number - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1745576299a2157037.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论