Как построить DTO в Nest.js для @Body - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок в Nest.js, и мне это очень понравилось.Я прочитал официальные документы и узнал о DTO.Когда Мое Тело такое:

{
  "username" : "username",
  "password" : "password"
}

тогда я могу просто создать user.dto.ts следующим образом:

import { IsNotEmpty } from 'class-validator';

export class UserDTO {
  @IsNotEmpty()
  username: string;
  @IsNotEmpty()
  password: string;
}

Затем я использую это в своем контроллере следующим образом.

  @Post('login')
  @UsePipes(new ValidationPipe())
  login(@Body() data: UserDTO) {
    return this.userService.login(data);
  }

Но мой вопрос в том, что, если мое тело будет чем-то вроде этого.

{
  "data": {
    "username": "username",
    "password": "password",
  }
}

тогда какие изменения мне нужно внести в мой файл `` user.dto.ts``, чтобы он работал?Спасибо

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы можете создать класс-обертку, который будет нести ваш dto, такой как

export class Data<T> {

  @ApiModelProperty()
  readonly data: T;

  constructor(data: any = {}) {
    this.data = data;
  }
}

, и в вашем контроллере у вас будет

@Post('login')
@UsePipes(new ValidationPipe())
login(@Body() data: Data<UserDTO>) {
 return this.userService.login(data);
}

в вашем сервисе, вы будете делать что-то вроде

return new Data(this.userDto);
0 голосов
/ 26 ноября 2018

Ответ таков: вам не нужно изменять DTO.

@Body() декоратор также принимает необязательный аргумент: @Body(path?: string).

Ключом здесь является понимание того, что делает @Body().@Body() без аргументов вернет req.body объект.@Body('path') вернет req.body.path (или req.body['path']. С этим знанием вы можете передать 'data' в @Body('data'), и он вернет req.body.data, который будет вашим DTO.

@Post('login')
@UsePipes(new ValidationPipe())
login(@Body('data') data: UserDTO) {
   // data will be your req.body.data which is your UserDTO
   return this.userService.login(data);
}
...