web-dev-qa-db-ja.com

@BodyのNest.jsでDTOを構築する方法

私は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``ファイルにどのような変更を加える必要がありますか?ありがとう

6
Usama Tahir

答えは:DTOを変更する必要はありません。

@Body()デコレータは、オプションの引数@Body(path?: string)も受け取ります。

ここで重要なのは、@Body()の機能を理解することです。引数なしの@Body()は、req.bodyオブジェクトを返します。 @Body('path')req.body.path(またはreq.body['path']を返します。この知識があれば、@Body('data')'data'を渡すことができ、DTOになるreq.body.dataが返されます。

@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

あなたのようなあなたの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);
1
kyserslick