回顾 MVC
MVC(Model-View-Controller)设计模式是一种常用于软件开发的架构模式,旨在分离应用程序的不同部分,使得它们可以独立地开发、测试和维护。它将应用程序分为三个主要组件:
Model(模型):
- 职责:负责管理应用程序的数据和业务逻辑。它直接与数据源(如数据库)进行交互,处理数据的获取、保存和更新。
- 特点:模型不直接处理用户界面或用户输入,它的主要任务是保证数据的完整性和一致性。
View(视图):
- 职责:负责呈现数据(模型)给用户,并将用户的输入传递给控制器。视图是用户与应用程序交互的界面部分。
- 特点:视图只关注如何展示数据,它不应该直接修改数据或处理业务逻辑。
Controller(控制器):
- 职责:作为模型和视图之间的桥梁,处理用户的输入,更新模型,并决定显示哪些视图。
- 特点:控制器接收用户的输入,调用模型的更新方法,并选择相应的视图来展示数据。
在nestjs中的应用
Nest (NestJS) 是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用渐进式 JavaScript,使用 TypeScript 构建并完全支持TypeScript(但仍允许开发人员使用纯 JavaScript 编写代码),并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应式编程)的元素。
Controller(控制器)
在NestJS中,控制器是一个基本构建块,它处理传入的 HTTP 请求、处理它们并返回适当的 HTTP 响应。控制器负责处理路由逻辑并与服务层交互以执行各种操作。
Service(服务)
在NestJS中,服务是一个封装了应用程序业务逻辑的 TypeScript 类。服务负责处理与数据相关的操作、与数据库、第三方 API 或其他外部资源交互,以及执行应用程序模块或控制器所需的任务。
Module(模块)
在NestJS中,模块是一个基本构建块,可帮助您将应用程序组织和划分为更小、更易于管理的部分。每个模块都封装了相关组件,例如控制器、提供程序(服务、存储库)和其他相关模块。模块可提高应用程序代码库的模块化、可重用性和可维护性。
main.ts
在NestJS应用程序中,main.ts 文件是应用程序的入口点,类似于许多编程语言中的 main 函数是入口点。它是启动 NestJS 应用程序时执行的第一个文件。main.ts 文件负责初始化和引导 NestJS 应用程序、设置各种配置以及启动应用程序。
实体 Entity (Model)
在NestJS应用程序中,实体充当模型,定义应用程序域内数据的结构和功能。此模型充当现实世界对象的表示,并指导如何组织和存储特定数据实体。例如,设想任务管理应用程序中的“任务”实体。此“实体”充当蓝图,概述任务的标题、描述和状态等属性,就像模型描述实际对象的属性一样。此外,实体可以封装与其他实体的关系,类似于模型如何描述不同对象之间的关联。此外,实体可以包含特定于其所表示数据的方法和行为,类似于模型如何包含与其对应的现实世界对象相关的函数。最终,实体为应用程序内高效的数据存储和交互奠定了基础,类似于模型为管理现实世界实体奠定了基础。
将 TypeORM 库集成到NestJS应用程序中后,实体将获得增强的功能,以实现无缝数据库交互。TypeORM 允许您使用面向对象的语法从数据库中创建、检索、更新和删除记录。通过利用装饰器和元数据,可以使用关系、验证和其他与数据库相关的细节来定义实体。TypeORM 抽象了底层 SQL 查询,使您能够以更直观和以 TypeScript 为中心的方式使用数据库。通过将现实世界的概念与数据库交互相结合,实体和 TypeORM 的这种组合使开发人员能够构建强大且可维护的应用程序,同时受益于 TypeORM 等 ORM 提供的强大功能。
// task.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class Task {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column({ default: 'OPEN' })
status: string;
}
DTO (Validation):
在NestJS应用程序环境中,DTO(数据传输对象)起着与验证检查点类似的关键作用,可确保数据在遍历应用程序的不同组件时保持准确性和一致性。正如现实世界中的验证过程会仔细检查输入质量一样,DTO 充当验证器。
// create-task.dto.ts
import { IsNotEmpty, IsString } from 'class-validator';
export class CreateTaskDto {
@IsNotEmpty()
@IsString()
title: string;
@IsNotEmpty()
@IsString()
description: string;
}