问题描述
我正在尝试将 ValidationPipe()
和 ParseIntPipe()
应用于 NestJs 控制器中的参数.
I'm trying to apply both the ValidationPipe()
and ParseIntPipe()
to the params in my NestJs controller.
目的是仅在 @Param('id')
上应用 ParseIntPipe()
,但 ValidationPipe()
用于 @Param('id')
中的所有参数code>CreateDataParams 和 Body DTO.
The intention is to apply ParseIntPipe()
only on @Param('id')
but ValidationPipe()
for all params in CreateDataParams
and Body DTO.
但是,我似乎无法按照我想要的方式应用这两个管道.这是我所拥有的:
However, I can't seem to apply both pipes the way I wanted. Here's what I have:
@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()
转换器,但这不起作用.
I have tried having another @Param('id')
to apply the ParseIntPipe()
transformer but this doesn't work.
如何将 ValidationPipe()
和 ParseIntPipe()
应用于参数?
How can I apply both ValidationPipe()
and ParseIntPipe()
to the params?
推荐答案
如果将 ParseIntPipe
应用到 id
参数,它只会转换 id
而不是 params
的属性 id
,这里将保留一个 string
.
If you apply the ParseIntPipe
to the id
param, it will only transform id
but not the property id
of params
, here it will stay a string
.
相反,您可以使用 class-transformer
将您的参数转换为 number
:
Instead, you can use class-transformer
to transform your param to a number
:
import { Transform } from 'class-transformer';
export class CreateDataParams {
@Transform(id => parseInt(id), {toClassOnly: true})
id: number;
}
然后使用带有选项 transform: true
:
@Post(':id')
@UsePipes(new ValidationPipe({transform: true}))
async create(
@Param() params: CreateDataParams,
@Body() createDto: CreateDto
) {
// params.id
}
但是请注意,这是不安全的,因为例如parseInt('5abc010')
是 5
.因此,您可能需要在转换函数中进行额外检查.
Note though, that this is unsafe because e.g. parseInt('5abc010')
is 5
. So you might want to do additional checks in your transformation function.
这篇关于如何将 ValidationPipe() 和 ParseIntPipe() 应用于参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!