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

问题描述

我正在尝试将 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() 应用于参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-26 06:34