簡體   English   中英

如何在Nest.js中為@Body構建DTO

[英]How to construct DTO in Nest.js for @Body

我是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' ,它將返回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);
}

你可以創建一個包含你的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM