首页 > 解决方案 > 如何在 Nest.js 中为 @Body 构建 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`` 文件中进行哪些修改才能使其正常工作?谢谢

标签: javascriptnestjstypeorm

解决方案


答案是:你不需要修改你的DTO.

@Body()装饰器还接受一个可选参数:@Body(path?: string).

这里的关键是要了解是做什么@Body()的。@Body()没有任何参数将返回req.body对象。@Body('path')将返回req.body.path (或req.body['path']. 有了这些知识,您可以传入'data'@Body('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);
}

推荐阅读