NestJs: 设计原理及认知

简述

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的生命周期过程

为了方便理解,将其写成逻辑图更为容易理解和记忆

备注:这是一张网上借来的图
image.png

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还支持使用装饰器定义更多的关系,如一对一关系、一对多关系和多对多关系等。在实际应用中,可能需要根据具体的业务需求来定义更复杂的实体类和关系。

实例分享

这是我之前规划的一个项目

image.png

参考语雀设计的思路,做了一个简单版的知识库系统

使用nestJs框架,并做了如下分类

image.png
将其配置文件放在config、控制器、实体类、以及过滤器、服务等,作为独立的模块分离出来,有效管理
image.png

看其设计的风格和手法,和JavaMvC可谓是异曲同工,什么依赖注入、模块化、拦截器、管道、IoC切片,这些设计模式和思想都有了,给我的感觉是,终于找到了一个比较易而且高效的框架,虽说没有其他库那么多插件,或者开发案例,但我想随着使用人的增多,该框架的应用和插件的开发,会越来越完善。

持续学习和总结中。。。。欢迎关注,收藏!?

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYHsjar0' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片