繁体   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