Какова цель объекта передачи данных в NestJS?

Я борюсь с проблемой. Я следую документации NestJS. Внутренняя структура для NodeJS. В документации упоминается DTO (объект передачи данных). Я создал DTO для создания пользователя:

export class CreateUserDto {
    readonly email: string;
    readonly password: string;
}

В сочетании с этим:

@Post('create')
createUser(@Body() userData: CreateUserDto): User {
    return this.usersService.createUser(userData);
}

По какой-то причине я могу отправить почтовый запрос по этому маршруту с любым типом тела. Я могу разместить в теле информацию любого типа без ошибок. Весь смысл такого DTO в том, чтобы разрешить только определенную информацию в теле, верно? Вместо использования класса экспорта CreateUserDTO я также попробовал интерфейс экспорта CreateUserDTO, но это тоже не работает. Я новичок в машинописном тексте и в NestJS. Есть ли кто-нибудь, кто мог бы объяснить, почему он не работает так, как я ожидал, или какова цель такого объекта передачи данных?


person Jonathan van de Groep    schedule 18.12.2019    source источник


Ответы (2)


Сам по себе DTO является скорее руководством для разработчика и тех, кто использует API, чтобы знать, какой формы ожидает тело запроса, он фактически не выполняет никаких проверок сам по себе. . Однако с помощью Typescript вы можете добавить декораторы из библиотеки class-validator и использовать встроенный ValidationPipe и запускайте проверки для ваших входящих запросов, чтобы могло поступать только тело ожидаемого запроса.

Короче говоря, DTO - это определение того, как должен выглядеть запрос, но поскольку JavaScript - это динамический язык, вы можете отправлять что угодно. Вот почему существуют такие библиотеки, как class-validator и runtypes.

person Jay McDoniel    schedule 18.12.2019
comment
спасибо @Jay McDoniel. Я использую ваше хранилище гнезд на своих частных уроках, неплохо! спасибо дважды! - person Jorge Guerra Pires; 20.05.2021

Во время выполнения все типы теряются, поэтому контроллер принимает все данные JSON из тела запроса. Если вам нужна проверка типа, вы должны включить ValidationPipe, который использует преобразователь классов и библиотеки класса-валидатора:

app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      transformOptions: {
        enableImplicitConversion: true,
      },
      validationError: { target: false, value: false },
    })
  ); 
person Fabio Formosa    schedule 17.04.2020