学到了,强大的企业级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 数据验证和转换(如校验请求参数、转换数据类型)。
相关推荐
Victor35629 分钟前
MySQL(138)如何设置数据归档策略?
后端
Victor35629 分钟前
MySQL(137)如何进行数据库审计?
后端
10年前端老司机4 小时前
React无限级菜单:一个项目带你突破技术瓶颈
前端·javascript·react.js
阿芯爱编程8 小时前
2025前端面试题
前端·面试
FreeBuf_8 小时前
黄金旋律IAB组织利用暴露的ASP.NET机器密钥实施未授权访问
网络·后端·asp.net
前端小趴菜059 小时前
React - createPortal
前端·vue.js·react.js
晓13139 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
张小洛9 小时前
Spring AOP 是如何生效的(入口源码级解析)?
java·后端·spring
菜包eo10 小时前
如何设置直播间的观看门槛,让直播间安全有效地运行?
前端·安全·音视频
烛阴10 小时前
JavaScript函数参数完全指南:从基础到高级技巧,一网打尽!
前端·javascript