菜单

NestJS 框架概述

相关源文件

本文档全面介绍了NestJS框架、其核心原则、架构和能力。它为理解NestJS应用程序的结构以及各个组件如何相互交互奠定了基础。有关微服务或GraphQL等子系统的具体实现细节,请参阅本Wiki中的相应部分。

什么是NestJS?

NestJS是一个渐进式的Node.js框架,用于构建高效、可扩展且面向企业的服务器端应用程序。它使用TypeScript构建,并利用了TypeScript的强类型能力,同时与纯JavaScript兼容。NestJS融合了面向对象编程(OOP)、函数式编程(FP)和函数响应式编程(FRP)的元素。

该框架提供了受Angular启发的强大架构基础,对于熟悉Angular结构和依赖注入系统的开发人员尤其具有吸引力。NestJS通过提供开箱即用的、一致的、有约束的结构,解决了Node.js应用程序架构的常见挑战。

来源: Readme.md24-33 package.json1-5

核心原则

NestJS围绕几个关键原则构建

  1. 模块化:应用程序被划分为模块,用于封装相关功能
  2. 依赖注入:组件声明其依赖项,这些依赖项由NestJS容器解析和注入
  3. 装饰器:大量使用TypeScript装饰器来定义元数据和增强类
  4. 平台无关:构建为可与各种HTTP平台配合使用(默认使用Express,Fastify作为替代)
  5. 可扩展性:框架可以通过自定义组件和第三方插件进行扩展

架构设计旨在创建以下应用程序:

  • 高度可测试
  • 松耦合
  • 易于维护
  • 可扩展

来源: Readme.md30-33 packages/core/Readme.md26-33

架构概述

NestJS的架构由几个核心组件组成,这些组件协同工作以提供一个统一的框架

来源: package.json1-5 Readme.md24-33

模块系统

NestJS架构的核心是其模块系统。每个NestJS应用程序至少有一个模块——根模块。模块用于组织应用程序组件,并将功能分离成可重用、连贯的块。

模块系统的关键特性

  • 根模块:应用程序的起点(通常是AppModule)
  • 功能模块:封装相关功能的领域特定模块
  • 共享模块:提供应用程序中可重用组件的模块
  • 动态模块:导入时可自定义的模块

典型的模块定义

模块有助于在应用程序组件之间保持清晰的界限,并通过NestJS依赖注入系统促进依赖管理。

有关模块系统的更多详细信息,请参阅 模块系统

来源: sample/06-mongoose/package.json1-5

依赖注入系统

NestJS实现了一个强大的依赖注入(DI)容器,该容器管理应用程序组件的创建和生命周期。DI系统是NestJS最显著的特性之一,深受Angular DI系统的启发。

DI系统自动解析依赖项

  1. 提供者注册:在模块元数据中注册提供者
  2. 依赖解析:当组件需要依赖项时,NestJS会从DI容器中解析它
  3. 生命周期管理:DI容器根据提供者的作用域管理其生命周期

有关依赖注入系统的详细信息,请参阅 依赖注入系统

来源: package.json62-80

请求处理管道

NestJS实现了一个复杂的请求处理管道,该管道通过一系列组件处理传入的请求,每个组件都有特定的职责

  1. 中间件:在路由处理程序之前执行的函数,通常用于请求预处理
  2. 守卫:确定请求是否应继续执行路由处理程序(授权)
  3. 拦截器:拦截请求/响应流,在处理程序执行之前/之后进行转换或添加逻辑
  4. 管道:将输入数据转换为所需格式或对其进行验证
  5. 路由处理程序:处理请求的控制器方法
  6. 异常过滤器:处理在请求处理过程中抛出的异常

管道中的每个组件都承担着特定的职责,遵循单一职责原则。这种管道架构实现了关注点的清晰分离,并使应用程序更易于维护。

有关请求处理管道的更多详细信息,请参阅 请求处理管道

来源: package.json61-81

平台适配器

NestJS被设计为平台无关的,允许它与不同的HTTP服务器实现配合使用。默认情况下,NestJS使用Express,但它也可以与Fastify配合使用。

平台适配器模式允许NestJS

  1. 抽象HTTP细节:提供与底层HTTP框架无关的统一API
  2. 切换实现:只需少量代码更改即可从Express切换到Fastify
  3. 利用平台特定功能:在需要时使用Express或Fastify的特定功能

Express集成(默认)

Express是NestJS的默认HTTP平台。它提供了

  • 成熟的生态系统,拥有众多中间件
  • 广泛的应用和社区支持
  • 许多Node.js开发人员熟悉的API

有关Express集成的更多信息,请参阅 Express集成

Fastify 集成

可以使用Fastify作为Express的替代品以获得更好的性能

  • 与Express相比,性能得到显著提升
  • 更低的内存占用
  • JSON模式验证
  • 可扩展的插件系统

有关Fastify集成的更多信息,请参阅 Fastify集成

来源: packages/platform-express/Readme.md1-15 packages/platform-fastify/Readme.md1-15

微服务支持

NestJS通过专用包(@nestjs/microservices)提供一流的微服务支持。这使得构建具有各种传输机制的分布式系统成为可能。

NestJS微服务的关键方面

  1. 多种传输方式:支持各种传输机制(TCP、Redis、NATS等)
  2. 通信模式:请求-响应和基于事件的模式
  3. 客户端-服务器模型:用于客户端通信的ClientProxy,用于服务器端处理的模式装饰器
  4. 混合应用程序:服务可以同时暴露REST和微服务端点

有关微服务的全面信息,请参阅 微服务

来源: packages/microservices/Readme.md1-15

数据库集成

NestJS可以通过专用包或社区模块与各种数据库技术集成。

最常用的数据库集成包括

TypeORM 集成

TypeORM是TypeScript和JavaScript的强大ORM,支持SQL和NoSQL数据库

  • 存储库模式
  • 实体装饰器
  • 关系(一对一、一对多、多对多)
  • 迁移支持

Mongoose 集成

Mongoose是MongoDB的ODM(对象文档映射器)

  • 模式定义
  • 模型和文档
  • 中间件支持
  • 验证

Sequelize 集成

Sequelize是Node.js的传统ORM

  • 对多种SQL数据库的支持
  • 模型定义
  • 事务
  • 钩子和验证

有关数据库集成的更多详细信息,请参阅 数据库集成

来源: sample/06-mongoose/package.json22-29 sample/14-mongoose-base/package.json22-28

GraphQL支持

NestJS通过@nestjs/graphql包提供了对GraphQL应用程序的出色支持,该包是Apollo Server的包装器。

NestJS提供两种GraphQL方法

代码优先方法

代码优先方法使用TypeScript类和装饰器来生成GraphQL模式

  • 将GraphQL类型定义为TypeScript类
  • 使用装饰器定义字段、类型和解析器
  • 模式根据TypeScript定义自动生成

有关代码优先方法的更多详细信息,请参阅 代码优先方法

Schema 优先方法

模式优先方法从GraphQL SDL(模式定义语言)开始

  • 使用GraphQL SDL语法定义模式
  • 从模式生成TypeScript定义
  • 实现与模式匹配的解析器

有关模式优先方法的更多详细信息,请参阅 模式优先方法

来源: sample/23-graphql-code-first/package.json22-34 sample/12-graphql-schema-first/package.json22-35 sample/22-graphql-prisma/package.json22-36

WebSocket支持

NestJS通过@nestjs/websockets包提供了对WebSocket的内置支持,从而实现了服务器与客户端之间的实时通信。

WebSocket支持的关键方面

  1. 网关:处理WebSocket连接和消息的类
  2. 适配器:对不同WebSocket实现(Socket.io、ws)的抽象
  3. 消息处理程序:处理传入消息的方法
  4. 广播:能够将消息发送给所有连接的客户端或特定房间

有关WebSocket支持的更多详细信息,请参阅 WebSocket

来源: packages/websockets/Readme.md1-15 packages/platform-socket.io/Readme.md1-15 packages/platform-ws/Readme.md1-15

测试工具

NestJS 提供了一个专用的测试包(@nestjs/testing),以便于测试使用该框架构建的应用程序。

NestJS 中的测试工具支持:

  1. 简化的模块创建:轻松创建具有模拟依赖项的测试模块
  2. 组件检索:从测试容器中检索组件
  3. 依赖覆盖:使用测试替身覆盖提供者
  4. 端到端测试:测试完整的应用程序流程

有关测试工具的更多详细信息,请参阅测试

来源: packages/testing/Readme.md1-15

结论

NestJS 是一个用于使用 Node.js 构建服务器端应用程序的全面框架。其架构围绕模块化、依赖注入和定义明确的请求处理管道而设计。该框架为各种用例提供了广泛的支持,包括 REST API、微服务、GraphQL、WebSockets 等。

NestJS 的关键优势包括:

  1. 结构化架构:关于如何组织代码的清晰指导
  2. TypeScript 集成:一流的 TypeScript 支持,附带装饰器
  3. 可扩展性:易于与第三方库和框架集成
  4. 多功能性:支持多种传输层和数据库技术
  5. 测试:为所有测试级别内置测试工具

通过利用这些功能,开发人员可以使用 NestJS 构建可维护、可扩展且可测试的服务器端应用程序。

来源: Readme.md24-33 package.json1-5