学到了,强大的企业级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 数据验证和转换(如校验请求参数、转换数据类型)。
相关推荐
gxn_mmf11 分钟前
典籍知识问答模块AI问答功能feedbackBug修改+添加对话名称修改功能
前端·后端·bug
samroom1 小时前
Webpack基本用法学习总结
前端·学习·webpack
向哆哆1 小时前
Spring Boot快速开发:从零开始搭建一个企业级应用
java·spring boot·后端
万能程序员-传康Kk1 小时前
食物数据分析系统vue+flask
前端·vue.js·flask
老华带你飞2 小时前
音乐网站|基于SprinBoot+vue的音乐网站(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·音乐网站
[email protected]2 小时前
ASP.NET Core 中实现 Markdown 渲染中间件
后端·中间件·asp.net·.netcore
是程序喵呀2 小时前
uni-app使用web-view组件APP实现返回上一页
前端·uni-app
Joker Zxc3 小时前
【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】
前端·css
2401_837088503 小时前
CSS flex:1
前端·css
发呆小天才yy7 小时前
uniapp 微信小程序使用图表
前端·微信小程序·uni-app·echarts