一尘不染

如何将ValidationPipe()和ParseIntPipe()应用于参数?

node.js

我正在尝试在NestJs控制器中同时应用ValidationPipe()ParseIntPipe()参数。

目的是ParseIntPipe()仅适用于Body
DTO中的所有参数,@Param('id')ValidationPipe()所有参数均适用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()参数?


阅读 624

收藏
2020-07-07

共1个答案

一尘不染

如果应用ParseIntPipeidPARAM,它只会改变id,但没有财产idparams,在这里它会留一个string

相反,您可以使用class-transformer将参数转换为number

import { Transform } from 'class-transformer';
export class CreateDataParams {
  @Transform(id => parseInt(id), {toClassOnly: true})
  id: number;
}

然后将ValidationPipe搭配使用选项transform: true

@Post(':id')
@UsePipes(new ValidationPipe({transform: true}))
async create(
    @Param() params: CreateDataParams,
    @Body() createDto: CreateDto
) {
    // params.id
}

不过请注意,这是不安全的,因为eg parseInt('5abc010')5。因此,您可能需要对转换功能进行其他检查。

2020-07-07