如何在 Nestjs 中为 @Body 构建 DTO

Posted

技术标签:

【中文标题】如何在 Nestjs 中为 @Body 构建 DTO【英文标题】:How to construct DTO in Nest.js for @Body 【发布时间】:2019-04-27 15:04:48 【问题描述】:

我是 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`` 文件中进行哪些修改才能使其正常工作?谢谢

【问题讨论】:

【参考方案1】:

答案是:您不需要修改您的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);

【讨论】:

【参考方案2】:

您可以创建一个包装类来携带您的 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);

【讨论】:

以上是关于如何在 Nestjs 中为 @Body 构建 DTO的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 如何使用 @Body() 装饰器访问帖子正文?

如何在nestjs中设置morgan-body

是否可以在 NestJs 中为 DTO 进行继承?

如何从控制器在nestjs应用程序中发送错误代码?

如何在服务nestjs中模拟getMongoRepository

如何使用 NestJS 构建授权服务?