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