企业级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 数据验证和转换(如校验请求参数、转换数据类型)。
相关推荐
YL雷子1 小时前
纯前端使用ExcelJS插件导出Excel
前端·vue·excel
muyun28001 小时前
History 模式 vs Hash 模式:Vue Router 技术决策因素详解
vue.js·算法·哈希算法
什么什么什么?2 小时前
el-table高度自适应vue页面指令
前端·javascript·elementui
码上暴富5 小时前
axios请求的取消
前端·javascript·vue.js
JefferyXZF5 小时前
Next.js 初识:从 React 到全栈开发的第一步(一)
前端·全栈·next.js
你的人类朋友6 小时前
✨什么是SaaS?什么是多租户?
后端·架构·设计
M1A16 小时前
全球语言无障碍:Unicode标准解读与技术演进史
后端
无限大66 小时前
多数元素问题:从暴力美学到摩尔投票神仙解法
后端
无限大66 小时前
《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
后端
洛可可白6 小时前
Spring Boot 应用结合 Knife4j 进行 API 分组授权管理配置
java·spring boot·后端