前言
如果你是一名前端学习者,在学习NestJS时你需要补充了解一些关于后端开发的知识以及编程思想,以此更好的搭建基于node的后端服务器
编程范式
以下提到的OOP、FP、FRP,这三种概念是不同的编程范式。范式,即写代码的方式 & 风格
FP
:
Functional Programming
函数式编程
例如,求数组 arr
的和,函数式编程风格是这样:
function Add(arr) {
let sum = 0
for (let i = 0; i < arr.length; i++) {
sum += arr[i]
}
return sum
}
- 确定的数据输入、输出;没有"副"作用,相对独立;
- 引用透明,对IDE优友好,易于理解;
如今主流的vue/react中的书写方式
OOP
:
Object Oriented Programming
面向对象式编程
- 抽象现象生活中的事物特征,对理解友好
- 封装性(高内聚低耦合)、继承性、多态性
Java、C++典型的面向对象的编程语言
例如,面向对象式编程是这样:
//定义类
class Person {
constructor(name, sex) {
this.name = name;
this.sex = sex;
}
}
//使用类
let str = new Person("彼日花", "男");
console.log(str)
AOP
:Aspect Oriented Programming 面向切面编程
- 扩展功能方便,不影响业务之间的逻辑
- 逻辑集中管理
- 更有利于代码复用
AOP能在不破坏功能的前提下,额外增加功能
OOP Vs AOP
- 面向目标不同:简单来说 OOP 是面向名词领域,AOP 面向动词领域。
- 思想结构不同:OOP 是纵向结构,AOP 是横向结构。
- 注重方面不同:OOP 注重业务逻辑单元的划分,AOP 偏重业务处理过程中的某个步骤或阶段。
- 两者之间是一个相互补充和完善的关系。
FRP
:Functional Reactive Programming
函数响应式编程
- 适合需要对事件流进行复杂组合应用的场景
- 响应式多用在异步的场景
- 典型案例:rxjs,广告推荐、
IoC与DI的那点事
:Inversion Of Control 控制反转
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
:Dependency Injection 依赖注入
二者关系:
Ioc是一种思想&是设计模式DI是IoC的具体实现
IoC与DI
- 控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于第三方”实现具有依赖关系的对象之间的解耦
- 依赖注入( Dependency Injection)是一种用于实现IoC的设计模式它允许在类外创建依赖对象,并通过不同的方式将这些对象提供给类。
Nest核心概念
graph LR
A(客户端) -- 请求 --> B(控制器)
B(控制器) -- 响应 --> A(客户端)
B(控制器) -- 使用服务 --> C(服务)
C(服务) -- 依赖注入 -->B(控制器)
C(服务) -- 数据库 --> D(数据接入)
D(数据接入) --持久化 --> C(服务)
Controller
层负责处理请求、返回响应Service
层负责提供方法和操作,只包含业务逻辑Data Access
层负责访问数据库中的数据
NestJS的生命周期
、
NestJS用模块来组织代码
- 使用
Module
来组织应用程序 @Module
装饰器来描述模块- 模块中有4大属性:
imports
、providers
、controllers
、exports
模块
graph TB
A(功能模块)
B(共享模块)
C(全局模块)
D(动态模块)
- 功能模块与共享模块是一回事,只是叫法不一样
- 全局模块通常应用在配置、数据库连接、日志上
- 动态模块是在使用到模块的时候才初始化(懒加载)
模块化举例
加餐:MVC是什么?
MVC是一种软件架构模式
:Model(模型) View(视图) Controller(控制器)
MVC模式
NestJS中的MVC
- Nestjs可以通过模板库实现View层,常见:
pug
、hus
、ejs
等 - Nestjs默认集成
express
作为web服务器,可以换成koa/fastify Controller
响应前端的请求,Model
是对应的具体的数据库逻辑
加餐:DTO与DAO
:
Data Transfer Object
数据传输对象
:
Data Access Object
数据访问对象
DTO Vs DAO
graph LR
A[请求] --> B(DTO) -- 逻辑 --> C(DAO) --> D[数据库]
C(DAO) --> B(DTO)
DTO:接受部分数据,对数据进行筛选,不对应实体,属性是小于等于实体
DAO:对接数据库接口,不暴露数据库的内部信息,对应实体
NestJS中的实体类
- DAO是一层逻辑:包含实体类、数据库操作(CURD)、数据校验错误处理等
- Nestjs做了一层更高级的封装,通过ORM库(如:
Prisma
、TypeORM
、Sequelize
)与种类数据库对接,而这些ORM库就是DAO层