简述
NestJS是一个用于构建服务器端应用程序的Node.js框架。如果将应用程序比作一间房子,NestJS就是帮助我们将房子修建得更加整洁、有序和可维护的工具。
首先,NestJS提供了一种叫做”依赖注入”的技术,它类似于将家具和装饰品放置在房子中的逻辑。通过依赖注入,我们可以更好地组织和管理应用程序中的不同组件,使它们之间的联系更加松散,这样一旦需要修改或替换某个家具,就变得非常容易。
其次,NestJS遵循了分层设计的原则。就像房子中有不同的房间,每个房间有自己的功能一样,NestJS将应用程序分为不同的”控制器”和”服务”。
nestJS经常被调侃为srpingJS,就是说它的分层设计。
控制器负责接收请求和返回响应,就像门口的门卫一样;而服务则负责处理具体的业务逻辑,就像内部的家政人员一样。这种分层的设计使得我们能够更好地组织和维护代码,同时使得每个组件关注自己的职责,就像洗衣机、风扇空调,只会关注自己内部的运行和效能,相互独立,避免了代码混乱。
此外,NestJS还引入了”模块化”的概念。就像房子可以由不同的模块构成(比如水泥、铺砖头、铁栏等等),每个模块有自己的功能和作用,NestJS将应用程序划分为不同的模块。每个模块可以包含控制器、服务和其他组件,它们可以共享和复用,让我们的应用程序更加灵活和可扩展
下面的介绍是关于我的一些学习和总结:
关于接口服务
一个请求的全过程:
请求 -> 请求数据校验(Pipe) -> 请求认知鉴权(Guard) -> 路由Controller -> 功能逻辑Service
-> 数据库操作(Repository) -> 响应
核心概念总结
- Controllers -> 处理请求
- Service -> 数据访问与核心逻辑
- Modules -> 组合所有的逻辑代码
- Pipes -> 管道–核验请求的数据
- Filters -> 过滤器–处理请求时的错误
- Guards -> 守卫–鉴权与认证
- Interceptors -> 拦截器-给请求与响应加入额外的逻辑
- Repositories -> 处理在数据库中数据
需要进一步了解NestJs的生命周期过程
为了方便理解,将其写成逻辑图更为容易理解和记忆
备注:这是一张网上借来的图
MySql数据库
一般NestJs结合Mysql,使用TypeORM库,文档比较齐全
Nestjs 使用 TypeORM 连接 mysql
下面是其中的一个引入方式
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'example',
database: 'testdb',
entities: ["dist/modules/**/*.entity{.ts,.js}"],
synchronize: true, //生产环境不要使用
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
另外一种,可以通过添加配置文件的方式进行使用
在根目录创建ormconfig.json
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "root",
"database": "test",
"entities": ["dist/modules/**/*.entity{.ts,.js}"],
"synchronize": true
}
但同时也需要在主module里面导入数据库连接池
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [TypeOrmModule.forRoot()],
})
export class AppModule {}
创建实体 Entity
一个实体例子
import {
Entity,
Column,
PrimaryGeneratedColumn,
UpdateDateColumn,
CreateDateColumn,
VersionColumn,
} from 'typeorm';
@Entity()
export class Article {
// 主键id
@PrimaryGeneratedColumn()
id: number;
// 创建时间
@CreateDateColumn()
createTime: Date
// 更新时间
@UpdateDateColumn()
updateTime: Date
// 软删除
@Column({
default: false
})
isDelete: boolean
// 更新次数
@VersionColumn()
version: number
// 文章标题
@Column('text')
title: string;
// 文章描述
@Column('text')
description: string;
// 文章内容
@Column('text')
content: string;
}
在上面的示例中,我们创建了一个名为”Article”的实体类。该类使用@Entity()
装饰器标记为一个实体类。
@PrimaryGeneratedColumn()
装饰器用于指定生成主键的列。
@Column()
装饰器用于指定普通列。在这个示例中,我们定义了两个普通列,分别是”isDelete”和”version”、“title”、“description”、“text”。
通过这种方式,我们可以轻松地创建实体类来映射数据库中的表结构。
TypeORM还支持使用装饰器定义更多的关系,如一对一关系、一对多关系和多对多关系等。在实际应用中,可能需要根据具体的业务需求来定义更复杂的实体类和关系。
实例分享
这是我之前规划的一个项目
参考语雀设计的思路,做了一个简单版的知识库系统
使用nestJs框架,并做了如下分类
将其配置文件放在config、控制器、实体类、以及过滤器、服务等,作为独立的模块分离出来,有效管理
看其设计的风格和手法,和JavaMvC可谓是异曲同工,什么依赖注入、模块化、拦截器、管道、IoC切片,这些设计模式和思想都有了,给我的感觉是,终于找到了一个比较易而且高效的框架,虽说没有其他库那么多插件,或者开发案例,但我想随着使用人的增多,该框架的应用和插件的开发,会越来越完善。
持续学习和总结中。。。。欢迎关注,收藏!?