首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Nestjs将数据从实体传输到DTO

NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用 TypeScript 编写,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。在 NestJS 中,实体(Entity)通常用于表示数据库中的表结构,而 DTO(Data Transfer Object)则用于在不同层之间传输数据。

基础概念

实体(Entity)

  • 实体是数据库表的映射。
  • 通常使用 TypeORM 或其他 ORM 工具来定义。
  • 包含字段和关系。

DTO(Data Transfer Object)

  • DTO 是一个简单的数据容器,用于在不同层之间传输数据。
  • 可以减少直接暴露数据库实体,提高安全性。
  • 可以自定义传输的数据结构。

优势

  1. 安全性:通过 DTO,可以控制哪些数据可以被外部访问,避免直接暴露数据库实体。
  2. 灵活性:DTO 可以根据不同的需求自定义数据结构,便于前端和后端之间的数据交互。
  3. 可维护性:分离数据传输逻辑和业务逻辑,使代码更易于维护。

类型

  • 输入 DTO:用于接收客户端发送的数据。
  • 输出 DTO:用于向客户端发送数据。

应用场景

  • API 接口:在控制器层接收和发送数据时使用。
  • 微服务通信:在不同微服务之间传输数据时使用。
  • 内部服务调用:在服务层之间传输数据时使用。

示例代码

假设我们有一个 User 实体和一个 UserDTO

User 实体

代码语言:txt
复制
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;

  @Column()
  password: string;
}

UserDTO

代码语言:txt
复制
export class UserDTO {
  id: number;
  name: string;
  email: string;
}

控制器

代码语言:txt
复制
import { Controller, Get, Param } from '@nestjs/common';
import { UserService } from './user.service';
import { UserDTO } from './user.dto';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get(':id')
  async getUser(@Param('id') id: string): Promise<UserDTO> {
    const user = await this.userService.findById(+id);
    return new UserDTO(user.id, user.name, user.email);
  }
}

服务层

代码语言:txt
复制
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  async findById(id: number): Promise<User> {
    return this.usersRepository.findOne(id);
  }
}

遇到的问题及解决方法

问题:如何在 DTO 中处理嵌套对象或数组?

解决方法: 可以使用嵌套的 DTO 来处理复杂的数据结构。

示例:嵌套 DTO

假设我们有一个 Post 实体和一个 PostDTO,并且 User 实体中包含一个 posts 数组。

代码语言:txt
复制
export class PostDTO {
  id: number;
  title: string;
  content: string;
}

export class UserWithPostsDTO extends UserDTO {
  posts: PostDTO[];
}

在控制器中使用:

代码语言:txt
复制
@Get(':id')
async getUserWithPosts(@Param('id') id: string): Promise<UserWithPostsDTO> {
  const user = await this.userService.findByIdWithPosts(+id);
  return new UserWithPostsDTO(user.id, user.name, user.email, user.posts.map(post => new PostDTO(post.id, post.title, post.content)));
}

通过这种方式,可以灵活地处理复杂的数据结构,并确保数据传输的安全性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Boot – 使用 ModelMapper 将实体映射到 DTO

Spring Boot – 使用 ModelMapper 将实体映射到 DTO 在企业应用中,我们使用RESTful服务来建立客户端和服务器之间的通信。...DTO 代表数据传输对象,这些对象从一层移动到另一层。DTO 还可用于隐藏数据库层对象的实现细节。将实体暴露给 Web 层而不正确处理响应可能会成为安全问题。...在此示例中,我们将为用户服务创建一个 Restful 应用程序,该应用程序使用模型映射器库将实体转换为 DTO。...我们将运行我们的应用程序,当我们完成数据库配置时,JPA 将使用我们添加到实体类中的注释自动在数据库中创建 User 表。...图 9 – 响应 我们还可以检查数据库中的新用户条目。 图 10 – 添加到数据库的用户 2. 获取用户: 我们将使用 GET 端点和用户 ID 从数据库中检索用户。

1.2K30

学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

数据库我选择的是Mysql,毕竟实际项目中大多数还是选择它的。因为文章属于从零教程, 所以会包含数据库的安装、连接、使用以及使用过程遇到的坑,如果你是有经验的老手,可以跳过这部分。...数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。...这一段是官方解释, 看不懂没关系,可以理解成,DTO 本身更像是一个指南, 在使用API时,方便我们了解请求期望的数据类型以及返回的数据对象。先使用一下,可能更方便理解。...现在就可以从API文档上直观的看到每个传参的含义、类型以及是否必传。到这一步并没有完, 虽然以及告诉别人怎么传, 但是一不小心传错了呢, 比如上面作者字段没传,会发生什么呢?...: 通过上边的学习,可以知道DTO本身是不存在任何验证功能, 但是我们可以借助class-validator来让DTO可以验证数据 总结 至此我们Nest.js快速上手入门就告一段落了,文章从项目如何搭建

14.6K65
  • 学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

    数据库我选择的是Mysql,毕竟实际项目中大多数还是选择它的。因为文章属于从零教程, 所以会包含数据库的安装、连接、使用以及使用过程遇到的坑,如果你是有经验的老手,可以跳过这部分。...数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。...这一段是官方解释, 看不懂没关系,可以理解成,DTO 本身更像是一个指南, 在使用API时,方便我们了解请求期望的数据类型以及返回的数据对象。先使用一下,可能更方便理解。...现在就可以从API文档上直观的看到每个传参的含义、类型以及是否必传。到这一步并没有完, 虽然以及告诉别人怎么传, 但是一不小心传错了呢, 比如上面作者字段没传,会发生什么呢?...: 通过上边的学习,可以知道DTO本身是不存在任何验证功能, 但是我们可以借助class-validator来让DTO可以验证数据 总结 至此我们Nest.js快速上手入门就告一段落了,文章从项目如何搭建

    10.6K11

    使用NestJs、GraphQL、TypeORM搭建后端服务

    后端开发同学应该都知道ORM的全称是对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中...本质上就是将数据从一种形式转换到另外一种形式。而TypeORM则是使用TypeScript编写的JavaScript版本的ORM库。...通过他我们可以定义一些Entity(实体),每个实体的数据字段,每个字段包含了数据类型,甚至是数据关系(一对多、多对多、多对一)。这些实体将映射到真实数据库中,创建真正的数据表。...image.png 3.2、改造app.module.ts 从@nestjs/typeorm中引入NestJs与TypeORM连接模块*TypeOrmModule,然后传入一个Object作为与数据库链接的...现在我们来src/modules/pokemon目录下创建实体文件pokemon.entity.ts。TypeORM的基本方法了解: Entity:实体装饰器,将一个类声明为一个实体。

    6.7K10

    NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

    它可以从环境变量中读取配置,然后在运行时以只读方式提供值。为了使 dev 和 prod 灵活,我们将使用 dotenv 模块。...定义和加载数据模型实体 TypeORM 支持自动加载数据模型实体。...因此,您在代码中更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您的数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内的数据...为了演示,我将添加一个简单的 endpoint,它将返回表中的数据。 我们使用 Nest.js CLI 添加一个项目控制器和一个项目服务。...等等 因此,我们将添加一个 ItemDTO 响应类,该类将由数据库中的项目实体填充。

    6.4K21

    NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

    它可以从环境变量中读取配置,然后在运行时以只读方式提供值。为了使 dev 和 prod 灵活,我们将使用 dotenv 模块。...定义和加载数据模型实体 TypeORM 支持自动加载数据模型实体。...因此,您在代码中更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您的数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内的数据...为了演示,我将添加一个简单的 endpoint,它将返回表中的数据。 我们使用 Nest.js CLI 添加一个项目控制器和一个项目服务。...等等 因此,我们将添加一个 ItemDTO 响应类,该类将由数据库中的项目实体填充。

    5.1K10

    NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

    它可以从环境变量中读取配置,然后在运行时以只读方式提供值。为了使 dev 和 prod 灵活,我们将使用 dotenv 模块。...定义和加载数据模型实体 TypeORM 支持自动加载数据模型实体。...因此,您在代码中更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您的数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内的数据...为了演示,我将添加一个简单的 endpoint,它将返回表中的数据。 我们使用 Nest.js CLI 添加一个项目控制器和一个项目服务。...等等 因此,我们将添加一个 ItemDTO 响应类,该类将由数据库中的项目实体填充。

    5.5K30

    Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 的恐惧

    一、什么是 DTO? 数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。...定义好 DTO 后,接下来将演示怎么和管道配合来验证参数。 二、管道 1. 概念 管道和拦截器有点像,都是在数据传输过程中的“关卡”,只不过各司其职。...绑定管道 绑定管道非常简单,就和之前使用 Guards 那样,直接用修饰符绑定在 Controller 上,然后将 body 的类型指定 DTO 即可: // src/logical/user/user.controller.ts...下一篇,将介绍一下如何使用拦截器进行权限认证。...(一):项目创建&路由设置&模块● Nest.js 从零到壹系列(二):数据库的连接● Nest.js 从零到壹系列(三):使用 JWT 实现单点登录 ·END·

    4.1K41

    Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 的恐惧

    一、什么是 DTO? 数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。...定义好 DTO 后,接下来将演示怎么和管道配合来验证参数。 二、管道 1. 概念 管道和拦截器有点像,都是在数据传输过程中的“关卡”,只不过各司其职。...管道有两个类型: 转换:管道将输入数据转换为所需的数据输出; 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常; ValidationPipe 是 Nest.js 自带的三个开箱即用的管道之一...绑定管道 绑定管道非常简单,就和之前使用 Guards 那样,直接用修饰符绑定在 Controller 上,然后将 body 的类型指定 DTO 即可: // src/logical/user/user.controller.ts...下一篇,将介绍一下如何使用拦截器进行权限认证。

    4K20

    实现nest中未定义参数的入参校验

    前言 当我们在dto层定义好参数字段后,客户端在调用时传入了未定义的字段,此时我们需要报错告知客户端这个字段不存在,在nest中默认不会报错,本文将分享这个问题的解决方案,欢迎各位感兴趣的开发者阅读本文...场景概述 我们继续用文章“使用NestJS搭建服务端应用[1]”所创建的项目,以此为基础来描述这个问题,如下所述代码所示,我们在AppDto.ts中定义了三个字段。...: string; } 随后,我们启动项目,使用postman调用接口,传多一个age字段,这个字段我们未曾在AppDto中定义,调用接口后,如下图所示,接口调用成功了,这并不是我们的期望结果,我们希望它报错...whitelist 如果设置为true,验证器将剥离任何不使用任何装饰器的属性的验证对象。...参考资料 [1]使用NestJS搭建服务端应用: https://juejin.cn/post/7053840108331466783 [2]main.ts: https://github.com/likaia

    3.5K30

    TypeORM用法浅析

    在开发中,通常是指将数据库中的表(关系模型)映射到编程语言中的对象(对象模型),ORM框架的作用就是帮助我们实现这种映射,以方便地在程序中进行数据的存储和检索。...本文以nestjs框架为例,nestjs和typeorm有着紧密的集成,提供了开箱即用的@nestjs/typeorm,更方便地进行数据库的连接,实体管理和依赖注入,详细可查看文档Database。...数据赋值通过dto自动映射到实体。...在保障dto类型检查准确的情况系下,第二种写法较为简洁。find通用查询方法,无条件时查询所有实体数据。...,可以指定别名,也可以不指定,不指定时默认会使用实体的类名来进行数据的操作, 因此建议使用简洁的别名。

    28721

    Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?

    ,这篇将解决另一个痛点:写文档。.../user.dto'; import { ApiTags } from '@nestjs/swagger'; @ApiTags('user') // 添加 接口标签 装饰器 @Controller('...Responses body 中的 token 复制出来,然后将页面拖到顶部,点击右上角那个带锁的按钮: 将 token 复制到弹窗的输入框,点击 Authorize,即可授权成功: 注意:这里显示的授权...详情: 再点击 try it out 按钮的时候,就会自动使用默认参数了: 总结 本篇介绍了如何使用 Swagger 自动生成可互动的文档。...(二):数据库的连接● Nest.js 从零到壹系列(四):使用中间件、拦截器、过滤器打造日志系统● Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0 ·END·

    4.7K10

    Node版Spring - 那些让人眼前一亮的NestJS特性

    /dto/create-cat.dto'; import { CatsService } from './cats.service'; import { Cat } from '....Pipe_1 管道有两个类型: 转换:管道将输入数据转换为所需的数据输出, 验证:对输入数据进行验证,比如form表单提交的数据类型 拦截器是使用 @Injectable() 装饰器注解的类。...它们可以: 在函数执行之前/之后绑定额外逻辑 转换从函数返回的结果 转换从函数抛出的异常 扩展基本函数行为 根据所选条件完全重写函数 (例如, 缓存目的) /* logging.interceptor.ts.../dto/create-cat.dto'; import { CatsService } from './cats.service'; import { Cat } from '....结束语 通过本文可以发现, Nestjs是一个有完整应用架构的框架,和Express、Koa等框架相比,提供了从基础控制器能力,安全(认证、鉴权),数据库集成到微服务。

    2.1K30
    领券