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
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);
}
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);