Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
301 views
in Technique[技术] by (71.8m points)

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

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...