如何将ValidationPipe()和ParseIntPipe()应用于参数? [英] How to apply both ValidationPipe() and ParseIntPipe() to params?

查看:97
本文介绍了如何将ValidationPipe()和ParseIntPipe()应用于参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to apply both the ValidationPipe() and ParseIntPipe() to the params in my NestJs controller.

目的是仅将ParseIntPipe()应用于@Param('id'),但将ValidationPipe()应用于CreateDataParams和主体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;
}

然后将ValidationPipe与选项transform: true一起使用:

Then you use the ValidationPipe with the option 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()应用于参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆