How to apply both ValidationPipe() and ParseIntPipe() to params?

送分小仙女□ 提交于 2019-12-20 04:28:10

问题


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

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
}

I have tried having another @Param('id') to apply the ParseIntPipe() transformer but this doesn't work.

How can I apply both ValidationPipe() and ParseIntPipe() to the params?


回答1:


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.

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;
}

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
}

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.



来源:https://stackoverflow.com/questions/55480448/how-to-apply-both-validationpipe-and-parseintpipe-to-params

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!