javascript - 如何在 Nest.js 中为 @Body 构造 DTO

标签 javascript nestjs typeorm

我是 Nest.js 的初学者,我发现它非常好。我阅读了官方文档并了解了 DTO。当我的 body 是这样的时候:

{
  "username" : "username",
  "password" : "password"
}

然后我可以像这样简单地创建 user.dto.ts:

import { IsNotEmpty } from 'class-validator';

export class UserDTO {
  @IsNotEmpty()
  username: string;
  @IsNotEmpty()
  password: string;
}

然后我像这样在我的 Controller 中使用它。

  @Post('login')
  @UsePipes(new ValidationPipe())
  login(@Body() data: UserDTO) {
    return this.userService.login(data);
  }

但我的问题是,如果我的 body 是这样的怎么办。

{
  "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);
}

关于javascript - 如何在 Nest.js 中为 @Body 构造 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473153/

相关文章:

javascript - ESLint 在基于 es6 的导入时失败 npm run build

javascript - 上传前更改文件内容

node.js - 如何对类型关系进行递归

javascript - 在 Backbone 模型中将数组渲染为列表

javascript - jquery用图片替换文字,求助

postgresql - TypeORM 通过 json 属性查询具有 jsonb 列的实体

NestJs 在多个模块中使用相同的服务实例

postgresql - 如何在 TypeORM 中定义 varchar 和 enum?

Nestjs Crud : Filter join request to return only data of current user

node.js - NestJS和TypeORM无法连接我的本地Postgres数据库。声称我的数据库不存在,即使存在