如何在Nest.js中为@Body

时间:2018-11-25 23:46:49

标签: javascript nestjs typeorm

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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