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

Car*_*ven 8 javascript validation node.js typescript nestjs

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

目的是ParseIntPipe()仅适用于@Param('id')ValidationPipe()适用于CreateDataParams和 Body 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
}
Run Code Online (Sandbox Code Playgroud)

我试过让另一个@Param('id')应用ParseIntPipe()变压器,但这不起作用。

我怎样才能同时应用ValidationPipe()ParseIntPipe()参数?

Kim*_*ern 13

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

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

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

然后你使用ValidationPipe带有选项的transform: true

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

但请注意,这是不安全的,因为例如parseInt('5abc010')5. 因此,您可能希望在转换函数中进行额外检查。