学到了,强大的企业级NestJS必须了解一下

学到了,强大的企业级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 数据验证和转换(如校验请求参数、转换数据类型)。
相关推荐
GreenTea2 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈2 小时前
FDE:一个缩写,两种命运
后端
mCell3 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
名字还没想好☜4 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
笃行3504 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
明月_清风4 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端
GetcharZp5 小时前
5 分钟拥有自己的 S3:RustFS 上手(MinIO 的 Rust 替代,Apache 2.0 可商用)
后端
excel5 小时前
前端加密的作用与使用场景
前端
行百里er6 小时前
Redis 版本演进、新特性与协议那些事儿
redis·后端
Joy T6 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state