企业级NestJS如何创建项目学起来

企业级NestJS如何创建项目学起来


outline: deep

NestJS认识

官网:docs.nestjs.com/

javascript 复制代码
https://docs.nestjs.com/

1、简介

NestJS 是一个基于 Node.js 构建的框架,主要使用 TypeScript 进行开发,理念是模块化和依赖注入。

适用性:适用于复杂后端架构、大型的企业级应用、微服务、企业级系统。

2、理念

结合了面向对象编程(OOP)、函数式编程(FP)和函数式响应式编程(FRP)的理念,借鉴了 Angular 的模块化设计思想

3、特点

👉TypeScript开发,类型安全

支持 TypeScript,提供强类型检查和接口定义,可以利用 TS的类型检查、装饰器、接口等

装饰器(Decorator)语法简化路由、中间件、拦截器等配置

👉模块化架构

模块化独立:应用划分为多个独立的模块,便于扩展和维护

项目分层:通过@Module 装饰器将代码按功能划分,每个模块封装控制器(Controller )、服务(Service)、依赖等,适合大型项目分层。

装饰器和元数据驱动:使用装饰器(如 @Controller@Injectable 等)来定义路由、控制器、服务等

依赖注入(DI):内建了一个强大的依赖注入系统,允许开发者轻松地管理和注入服务,基于 IoC(控制反转)容器,自动管理类之间的依赖关系,提升代码解耦和可测试性;与 Angular 的依赖注入机制类似,减少了手动管理依赖关系的复杂度

👉多协议支持
  • HTTP 服务:默认集成 Express 或 Fastify,支持不同的 HTTP 服务器框架(Express 或 Fastify),支持 RESTful API 开发,支持各种持久化工具(如 TypeORM、Mongoose 等)
  • 微服务:内置 TCP、gRPC、MQTT 等协议,轻松构建分布式系统。
  • WebSocket :通过 @WebSocketGateway 支持实时通信。
  • GraphQL:深度整合 Apollo 或 Mercurius,快速开发 GraphQL API
  • 可测试性:提供了单元测试和集成测试。通过依赖注入、模块化设计方便测试。
👉丰富的生态系统
  • 官方工具库:提供 CLI、认证(Passport)、数据库集成(TypeORM、Prisma)、缓存(Redis)、队列(BullMQ)等模块
  • 第三方扩展:活跃的社区支持,可快速集成 Swagger(API 文档)、日志(Winston)、监控(Prometheus)等。

4、应用场景以及选择原因

应用场景

RESTful API 服务:与 TypeORM 或 Mongoose 集成时,能快速创建和管理数据库。

GraphQL API 服务:对 GraphQL 支持良好,支持自动生成 schema 和解析器。

微服务架构:对微服务架构的支持良好,适用于构建分布式应用,支持多种通信协议(如 gRPC、WebSockets、Redis 等)。

实时应用:支持 WebSockets 和其他实时通信机制,适合即时通讯的应用,如聊天应用或实时通知系统。

选择原因

之前我们的Node后端采取的是Express框架,但是随着项目规模的扩大,项目逐渐逐渐庞大,对比了Koa和NestJS后,选择了NestJS框架,因为Koa我觉得其实跟我的Express差别不大,不如直接采用Express,而TS也是一种趋势,所以选择了NestJS

JS 复制代码
express:功能强大,内置中间件和路由,简单,适合中小型项目
koa :轻量级,灵活,需手动管理中间件和路由,适合中小型项目
NestJS:基于TypeScript,支持模块化、依赖注入和装饰器,组织清晰,适合大型项目

因此我选择了NestJS框架作为项目升级,它提供了更好的代码组织、模块化和高维护性,内置了依赖注入和装饰器等高级功能,使得代码更加简洁和易读。

5、应用示例

NestJS 应用示例:

javascript 复制代码
import { Controller, Get } from '@nestjs/common';
import { Request } from 'express';
@Controller('cats')
  export class CatsController {
    @Get()
    findAll(): string {
      return 'This action returns all cats';
    }
}

在这个例子中,@Controller('cats') 定义了一个控制器,并且 @Get() 装饰器标记了一个 GET 请求的路由方法

这里我们简单看看上面部分代码的作用

javascript 复制代码
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

// 导入NestJS 的几个装饰器和 Request 类型:
Controller:用于映射到一个特定的路由路径
Get:就是HTTP GET 请求方法
Req:获取 HTTP 请求对象
Request:express 模块中导入的类型,HTTP 请求对象的类型,用来进行类型检查


@Controller('cats')
就是我们请求的接口 `/cats`

然后导出CatsController类
  =>@Get()装饰器将 findAll 方法与 HTTP GET 请求关联
  => 当用户访问 /cats 路由时,调用findAll方法

findAll(@Req() request: Request): string {
  return 'This action returns all cats';
}

这里findAll()就是一个比较普通的TS函数,返回我们string类型的数据

6、核心组件

组件 作用
Controller 处理 HTTP 请求,定义路由和参数解析(类似 MVC 中的控制器)。
Service 封装业务逻辑,通过依赖注入供控制器或其他服务调用。
Middleware 在请求到达控制器前执行,用于日志、鉴权、数据转换等。
Interceptor 拦截请求和响应,实现全局异常处理、数据包装、性能监控等。
Guard 路由守卫,控制请求权限(如角色验证)。
Pipe 数据验证和转换(如校验请求参数、转换数据类型)。
相关推荐
程序猿chen9 分钟前
JVM考古现场(十九):量子封神·用鸿蒙编译器重铸天道法则
java·jvm·git·后端·程序人生·java-ee·restful
1024小神22 分钟前
在GitHub action中使用添加项目中配置文件的值为环境变量
前端·javascript
Chandler2426 分钟前
Go:接口
开发语言·后端·golang
ErizJ28 分钟前
Golang|Channel 相关用法理解
开发语言·后端·golang
automan0228 分钟前
golang 在windows 系统的交叉编译
开发语言·后端·golang
Pandaconda29 分钟前
【新人系列】Golang 入门(十三):结构体 - 下
后端·golang·go·方法·结构体·后端开发·值传递
齐尹秦30 分钟前
CSS 列表样式学习笔记
前端
Mnxj34 分钟前
渐变边框设计
前端
我是谁的程序员37 分钟前
Flutter iOS真机调试报错弹窗:不受信任的开发者
后端
用户76787977373237 分钟前
由Umi升级到Next方案
前端·next.js