如何在 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() 装饰器访问帖子正文?