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

问题描述 投票:1回答:1

我正在尝试将ValidationPipe()ParseIntPipe()应用到我的NestJs控制器中的params。

目的是仅在ParseIntPipe()上使用@Param('id'),但在ValidationPipe()和Body DTO中使用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()同时应用于params?

javascript node.js typescript validation nestjs
1个回答
2
投票

如果你将ParseIntPipe应用于id param,它只会变换id而不是id的属性params,在这里它将保持string

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

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

然后你使用ValidationPipetransform: true选项:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.