web-dev-qa-db-fra.com

Comment construire DTO dans Nest.js pour @Body

Je suis un débutant sur Nest.js et je l'ai trouvé extrêmement bon. J'ai lu les documents officiels et j'ai découvert les DTO. Quand mon corps est comme ça:

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

alors je peux simplement créer user.dto.ts comme ça:

import { IsNotEmpty } from 'class-validator';

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

Ensuite, j'utilise cela dans mon contrôleur comme ça.

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

Mais ma question est de savoir si mon corps est quelque chose comme ça.

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

alors quelles modifications dois-je faire dans mon fichier `` user.dto.ts`` pour le faire fonctionner? Merci

6
Usama Tahir

La réponse est: vous n'avez pas besoin de modifier votre DTO.

@Body() decorator accepte également un argument optionnel: @Body(path?: string).

La clé ici est de comprendre ce que fait @Body(). @Body() sans aucun argument retournera l'objet req.body. @Body('path') renverra req.body.path (ou req.body['path']. Avec cette connaissance, vous pouvez passer 'data' dans @Body('data') et il renverra req.body.data Qui sera votre 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);
}
4
Chau Tran

Vous pouvez créer une classe wrapper qui porterait votre dto tel que

export class Data<T> {

  @ApiModelProperty()
  readonly data: T;

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

et dans votre contrôleur, vous aurez

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

à votre service, vous ferez quelque chose comme

return new Data(this.userDto);
1
kyserslick