我正在尝试在NestJs控制器中同时应用ValidationPipe()和ParseIntPipe()参数。
ValidationPipe()
ParseIntPipe()
目的是ParseIntPipe()仅适用于Body DTO中的所有参数,@Param('id')但ValidationPipe()所有参数均适用CreateDataParams。
@Param('id')
CreateDataParams
但是,我似乎无法按照我想要的方式来应用两个管道。这是我所拥有的:
@Post(':id') @UsePipes(new ValidationPipe()) async create( @Param('id', new ParseIntPipe()) id: number, //this doesn't work @Param() params: CreateDataParams, @Body() createDto: CreateDto ) { // params.id }
我试图让另一个@Param('id')人使用该ParseIntPipe()变压器,但这不起作用。
我怎样才能同时应用ValidationPipe()和应用ParseIntPipe()参数?
如果应用ParseIntPipe到idPARAM,它只会改变id,但没有财产id的params,在这里它会留一个string。
ParseIntPipe
id
params
string
相反,您可以使用class-transformer将参数转换为number:
class-transformer
number
import { Transform } from 'class-transformer'; export class CreateDataParams { @Transform(id => parseInt(id), {toClassOnly: true}) id: number; }
然后将ValidationPipe搭配使用选项transform: true:
ValidationPipe
transform: true
@Post(':id') @UsePipes(new ValidationPipe({transform: true})) async create( @Param() params: CreateDataParams, @Body() createDto: CreateDto ) { // params.id }
不过请注意,这是不安全的,因为eg parseInt('5abc010')是5。因此,您可能需要对转换功能进行其他检查。
parseInt('5abc010')
5