[英]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.