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

时间:2019-04-02 17:26:08

标签: javascript node.js typescript validation nestjs

我正在尝试将ValidationPipe()ParseIntPipe()应用于我的NestJs控制器中的参数。

目的是仅将ParseIntPipe()应用于@Param('id')并将ValidationPipe()应用于CreateDataParams和主体DTO中的所有参数。

但是,我似乎无法按照自己的方式来应用两个管道。这是我所拥有的:

@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()应用于参数?

1 个答案:

答案 0 :(得分:2)

如果将ParseIntPipe应用于id参数,它将仅转换id的属性,而不转换id的属性params,此处将保留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
}

不过请注意,由于例如parseInt('5abc010')5。因此,您可能需要对转换函数进行其他检查。