@Query () не преобразуется в DTO - PullRequest
0 голосов
/ 14 октября 2019

У меня есть контроллер, который должен получать данные в строке запроса (я не могу использовать тело, потому что я взаимодействую с устаревшей системой).

Я написал параметры запроса карты DTO для объекта и использую ValidationPipe для проверки и преобразования данных в мой DTO.

Итак, у меня есть следующее:

import { Get, Controller, Query, Post, Body, UsePipes, ValidationPipe } from '@nestjs/common';

class TestDto {
  @IsNumber()
  field1: number;
  @IsBoolean()
  field2: boolean;
}

@Controller()
export class AppController {
  constructor() {}

  @Get()
  @UsePipes(new ValidationPipe({ whitelist: false, transform: true}))
  root(@Query() dto: TestDto): TestDto {
    return dto;
  }

}

Весь предыдущий код компилируется и следует документации NestJS, но когда я вызываю http://localhost:3000/?field1=15&field2=true, я получаю это:

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": [
        {
            "target": {
                "field1": "15",
                "field2": "true"
            },
            "value": "15",
            "property": "field1",
            "children": [],
            "constraints": {
                "isNumber": "field1 must be a number"
            }
        },
        {
            "target": {
                "field1": "15",
                "field2": "true"
            },
            "value": "true",
            "property": "field2",
            "children": [],
            "constraints": {
                "isBoolean": "field2 must be a boolean value"
            }
        }
    ]
}

Оба поля действительны в соответствии с атрибутами, но с конвейеромотклоняет запрос. Если я перехожу с @IsNumber на @IsNumberString и с @IsBoolean на @IsBooleanString, это подтверждает, но я не получаю преобразованные данные (то есть вместо моего DTO я получаю простой объект)

Кто-нибудь сталкивался с чем-то вродеэто?

1 Ответ

1 голос
/ 14 октября 2019

Не может, поскольку интерфейсы только формируют вашу структуру или говорят что-то о типе. Ваша проверка не будет работать правильно из-за того же факта.

class TestDto

См. Документы NestJS - Автоматическая проверка Документы NestJS - Преобразование полезной нагрузки

В качестве примера в документации сказано:

import { IsEmail, IsNotEmpty } from 'class-validator'; // 'class'

export class CreateUserDto { // notice class
  @IsEmail()
  email: string;

  @IsNotEmpty()
  password: string;
}

Обновление № 1 - сообщить валидатору, чтобы попытаться выполнить неявное преобразование

@UsePipes( new ValidationPipe( { transform: true, transformOptions: {enableImplicitConversion: true} }))

Обновление № 2 - использовать пользовательский @Query() параметр-декоратор

import { Controller, createParamDecorator, Get, UsePipes, ValidationPipe } from '@nestjs/common';
import { IsNumber } from 'class-validator';
import { AppService } from './app.service';

const MyField = createParamDecorator((data, req) => {
  const result = new TestDto();
  result.field1 = Number(req.query.field1);
  return result;
});

class TestDto {
  @IsNumber()
  field1: number;
}

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {
  }

  @Get()
  @UsePipes(new ValidationPipe({ transform: true }))
  getHello(@MyField() testDto: TestDto): TestDto {
    return testDto;
  }
}
...