首页 > 其他分享 >NestJS 基础概念

NestJS 基础概念

时间:2024-04-08 14:56:22浏览次数:24  
标签:控制器 拦截器 请求 可以 基础 概念 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方法之前执行。

主要功能为:

    1. 在方法执行前/后绑定额外的逻辑:
      拦截器可以在Controller方法被调用之前或之后执行自定义代码。这允许你执行如身份验证日志记录、性能监控等任务,这些任务通常是应用程序中每个请求都需要执行的。

    2. 转换函数返回的结果:
      你可以使用拦截器来修改从控制器方法返回的数据。例如,你可能希望转换数据的格式,或添加额外的元数据到响应中。

    3. 转换函数抛出的异常:
      如果控制器方法抛出了异常,拦截器可以捕获这个异常,并根据需要转换它。这可以用于统一异常处理,例如将内部错误转换为更友好的用户错误信息。

    4. 扩展基本函数行为:
      拦截器允许你在不修改原始控制器方法的情况下添加新的功能。这意味着你可以在不破坏现有代码的基础上,增强应用程序的功能。

    5. 根据特定条件完全覆盖一个函数:
      有时,你可能想要根据某些条件(如缓存)完全替换控制器方法的默认行为。拦截器可以做到这一点,通过检查特定条件,并在满足这些条件时返回预定义的结果或执行不同的逻辑。

 

6. Pipes(管道):

主要用于对请求接口的入参进行验证和转换的前置操作。(每当一个请求被路由到具体的Controller方法后,会先通过管道对传入的请求参数进行转换和验证 )

 

7. Exception filters (异常过滤器):

用来处理应用程序中抛出的异常和错误的。

 可以实现:
  1. 统一错误响应格式
  2. 自定义HTTP状态码
  3. 添加额外的响应信息
  4. 记录错误日志

 

 

标签:控制器,拦截器,请求,可以,基础,概念,NestJS,模块
From: https://www.cnblogs.com/xinfangzhang/p/18121157

相关文章

  • 基础知识
    一个字节八位二进制一个字节二位十六进制----------变量变量如果不初始化就会产生随机值局部变量和全局变量局部变量和全局变量名字相同时,局部变量优先级高--------------========----------------- 常量例如define MAX100 --------------------------sca......
  • 一起学习python——基础篇(7)
    今天讲一下python的函数。函数是什么?函数是一段独立的代码块,这块代码是为了实现一些功能,而这个代码块只有在被调用时才能运行。在Python中,使用 def关键字定义函数:函数的固定结构就是def(关键字)+函数名字(自己定义)+():deftest_function():#里面的内容一定要有空格(......
  • Android开发基础:AdapterView类视图控件的使用,Fragment,ViewPager2视图控件的使用
    目录一,Adapter1.什么是Adapter? 2.Android中的常用Adapter二,AdapterView1.AdapterView简介 2.AdapterView的子视图对象 三,ListView滑动列表形式四,GridView网格形式显示 五,Fragment和ViewPager2视图控件的使用1.什么是Fragment?2.ViewPager23.TabLayout+ViewPage......
  • MPLS-基础、LSR、LSP、标签、体系结构
    MPLS技术MPLS基础MPLS:转发数据时,只在网络边缘分析IP报文头,不在每一跳都分析,节约了转发时间。MPLS:MultiprotocolLabelSwitching,多协议标签交换骨干网技术。主要应用:VPN、流量工程、QoS(QualityofService)等方面。ATM:AsynchronousTransferMode,异步传输模式。应用方面:VPN......
  • 数字电子基础——编码器
    编码器编码:用文字、符号或数字表示特定对象的过程。在数字电路中,采用二进制进行编码编码器:实现编码功能的电路二进制编码器用nnn位二进制代码对......
  • 前端学习<四>JavaScript基础——11-流程控制语句:选择结构(if和switch)
    代码块用{}包围起来的代码,就是代码块。在ES5语法中,代码块,只具有分组的作用,没有其他的用途。代码块中的内容,在外部是完全可见的。举例: {   vara=2;   alert('qianguyihao');   console.log('千古壹号'); } ​ console.log('a='+a);打印结......
  • 前端学习<四>JavaScript基础——10-运算符
    我们在前面讲过变量,本文讲一下运算符和表达式。运算符的定义和分类运算符的定义运算符:也叫操作符,是一种符号。通过运算符可以对一个或多个值进行运算,并获取运算结果。表达式:数字、运算符、变量的组合(组成的式子)。表达式最终都会有一个运算结果,我们将这个结果称为表达式的......
  • PCB学习记录-----入门&基础知识
    一、搭建环境1.下载嘉立创EDA 软件下载-嘉立创EDA(lceda.cn)选专业版在线编辑:嘉立创EDA(专业版)-V2.1.45(lceda.cn)官方教程:立创EDA专业版-使用教程(lceda.cn)2.新建工程文件-新建-项目,右键Board1可以重命名,原理图右键新增图页右侧图纸尺寸可自定义调整图纸......
  • 29_进程基础
    进程基础介绍进程[动态]指正在运行的程序(保持在存储介质上的,经过编译的,可执行的二进制文件[静态]),换句话说,进程是程序的执行过程。如下图示,进程是资源分配的最小单位,在某一时刻cpu只运行一个进程,通过时间片轮转切换来实现很多进程看似的"同时运行"。可以通过“ps”或......
  • Java零基础入门-String
    一、概述        近期有个小伙伴在看我的文章,说我在讲完基本类型,只是顺带提了一嘴String,然后说他的老师在课上对这String讲了足足一节课,好家伙,我觉得啊,这勾起了我的回忆,当初我看String的源码及知识点时,也是看了很久,这怪我,疏忽大意了啊。既然被这位小伙伴吐槽,那我就为......