Как применить оба параметра ValidationPipe () и ParseIntPipe () к параметрам? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь применить оба параметра ValidationPipe() и ParseIntPipe() к параметрам в моем контроллере NestJs.

Цель состоит в том, чтобы применить ParseIntPipe() только к @Param('id'), но ValidationPipe() длявсе параметры в CreateDataParams и Body DTO.

Однако я не могу применить обе трубы так, как хотел.Вот что у меня есть:

@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() трансформатора, но это не сработало.

Как я могу применить оба ValidationPipe()и ParseIntPipe() к параметрам?

1 Ответ

2 голосов
/ 02 апреля 2019

Если вы примените ParseIntPipe к параметру id, он будет преобразовывать только id, но не свойство id из params, здесь оно останется string.

Вместо этого вы можете использовать class-transformer для преобразования вашего параметра в number:

import { Transform } from 'class-transformer';
export class CreateDataParams {
  @Transform(id => parseInt(id), {toClassOnly: true})
  id: number;
}

Затем вы используете ValidationPipe с опцией transform: true:

@Post(':id')
@UsePipes(new ValidationPipe({transform: true}))
async create(
    @Param() params: CreateDataParams,
    @Body() createDto: CreateDto
) {
    // params.id
}

Обратите внимание, что это небезопасно, например, потому что parseInt('5abc010') - это 5. Так что вы можете захотеть сделать дополнительные проверки в вашей функции преобразования.

...