NestJS 基础概念
1. Module
Module是NestJS 的基本组织单位。
模块系统基于 Node.js 的 CommonJS 模块系统,但提供了更高级别的抽象和组织方式。通过使用模块,你可以将应用程序拆分成多个独立且可复用的部分,每个模块都负责实现特定的功能或业务逻辑。
模块可以封装相关的代码、配置和依赖关系,使得模块内部的实现细节对外不可见,只暴露必要的接口和功能。
模块之间可以定义明确的依赖关系,通过导入(imports)其他模块来获取所需的功能和服务。这有助于管理复杂应用程序中的依赖关系,确保组件之间的正确交互。
可以使用 @Module()
装饰器来定义一个模块,并在装饰器的元数据中指定模块的提供者、控制器、导入的模块等。这样,NestJS 就可以根据这些信息来构建和管理应用程序的模块结构。
2. Provider
Provider是基于依赖注入的概念(Dependency Injection,简称DI)
是一种实现控制反转(Inversion of Control,简称IoC)的设计模式。
基本思想是解耦,通过外部框架,将类所依赖的对象(Provider)注入到类中,使得类在运行时动态地获取其所依赖的对象实例,从而实现松耦合。而不是硬编码方式直接关联在一起。
在 NestJS 中,你通常在模块的 @Module
装饰器的 providers
数组中注册提供者。这告诉 NestJS 该模块提供了哪些服务或值,并且这些提供者可以在该模块的作用域内被注入到其他类中。同时,如果你需要将提供者导出到其他模块使用,你可以在 exports
数组中指定它们。
可以通过装饰器(如 @Injectable()
)和构造函数参数来声明和注入依赖关系,NestJS 会在运行时自动解析这些依赖关系,并将相应的实例注入到类中。
3.Middleware
Middleware实际上是一个函数,它可以在请求或响应对象上执行某些操作,或者在传递给下一个处理程序之前进行预处理。这些Middleware函数在请求的处理过程中,按照定义的顺序依次执行,形成了一个类似洋葱模型的层层包裹和处理的结构。
4. Guards(守卫):
通常用于身份验证、角色检查或权限验证。
是最先执行的中间件,用于确定是否允许请求继续处理。(在请求还没到控制器之前执行)
5. Interceptors (拦截器):
如果 Guards 允许请求继续,那么 Interceptors 会在 Pipes 和Controller方法之前执行。
主要功能为:
-
在方法执行前/后绑定额外的逻辑:
拦截器可以在Controller方法被调用之前或之后执行自定义代码。这允许你执行如日志记录等每个请求都需要执行的任务。 -
转换函数返回的结果:
你可以使用拦截器来修改从控制器方法返回的数据。例如,你可能希望转换数据的格式,或添加额外的元数据到响应中。 -
转换函数抛出的异常:
如果控制器方法抛出了异常,拦截器可以捕获这个异常,并根据需要转换它。这可以用于统一异常处理,例如将内部错误转换为更友好的用户错误信息。 -
扩展基本函数行为:
拦截器允许你在不修改原始控制器方法的情况下添加新的功能。这意味着你可以在不破坏现有代码的基础上,增强应用程序的功能。 -
根据特定条件完全覆盖一个函数:
有时,你可能想要根据某些条件(如缓存)完全替换控制器方法的默认行为。拦截器可以做到这一点,通过检查特定条件,并在满足这些条件时返回预定义的结果或执行不同的逻辑。
6. Pipes(管道):
主要用于对请求接口的入参进行验证和转换的前置操作。(每当一个请求被路由到具体的Controller方法后,会先通过管道对传入的请求参数进行转换和验证 )
7. Exception filters (异常过滤器):
用来处理应用程序中抛出的异常和错误的。
- 统一错误响应格式
- 自定义HTTP状态码
- 添加额外的响应信息
- 记录错误日志