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