我正在尝试将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?
如果你将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;
}
然后你使用ValidationPipe
和transform: true
选项:
@Post(':id')
@UsePipes(new ValidationPipe({transform: true}))
async create(
@Param() params: CreateDataParams,
@Body() createDto: CreateDto
) {
// params.id
}
但请注意,这是不安全的,因为例如parseInt('5abc010')
是5
。因此,您可能希望在转换函数中执行其他检查。