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