首页 > 其他分享 >Nestjs系列 Nestjs进阶(一)

Nestjs系列 Nestjs进阶(一)

时间:2024-03-08 14:13:59浏览次数:20  
标签:系列 进阶 自定义 register Module Nestjs 模块 装饰

自定义装饰器

简单使用

当 Nest 内置的装饰器不能满足开发需求时,可以自定义装饰器,其自定义装饰器的规则和 react 的自定义 hooks 较为相似,自定义时,其封装必须使用 Nest 的内置装饰器或者其它自定义装饰器,react 中是必须使用 react hooks,这一点规则类似。

使用命令快速创建一个 decotator 模板

nest g decorator role --flat

image

这就是一个最基础的自定义装饰器,然后创建一个 guard 模板,使用 guard。

image

自定义装饰器调用其它装饰器

当装饰器相使用过多且相似时,可以在自定义装饰器里通过 applyDecorators 组合多个其它装饰器(包括其它的自定义装饰器)

image

applyDecorators 可以将多个装饰器合并条用

自定义参数装饰器

createParamDecorator 顾名思义,创建参数装饰器。可以接收装饰器传入的参数,还内置了 ctx 上下文,用于获取 request、response 等参数。

image

Module 和 Provider 循环依赖问题

什么是循环依赖,比如 A 模块引用了 B 模块,而 B 模块也引用了 A 模块,在执行时,IOC 容器就不知道该先注入A 还是先注入 B。这就是 Nest 中的循环引用。
注:Springboot 大于 2.7 版本之后,已经默认禁止了循环引用。

首先做一个相互引用的示例:

image

此时启动之后报错

image

报错的主要错误信息就是:模块之间的存在循环依赖。需使用 forwardRef() 来避免。可以阅读文档 循环依赖

Module 之间的互相导入

对于 Module 之间导入时的循环引用可以使用如下方式

image

Service 之间的互相注入

对于 Service 层的互相注入,在 @Inject 时,则同样需要添加 forwardRef(),不然也会报错

image

总结

forwardRef 就是解决 Module 之间的互相导入,Service 之间的互相注入用的。其本质就是通过函数延迟解析,直到所有相关的模块都已被扫描并且注册到容器中。这样当函数被调用时,相关的模块已经可用,从而解决了循环依赖问题。

动态创建模块

provider 是可以通过 useFactory 动态生成数据的,详情可阅读 Nestjs基础(二)。Module 也是可以的。文档链接 动态模块

需要给 module 添加 register 静态方法,然后可以通过外部传入参数,在不同模块导入的时候,可以定义不同的数据

image

取值时,就还是使用 @Inject 注入

image

约定名称

动态模块的 register 方法并不是非要用此方法名,但 nest 约定了 3 种方法名,来分别用来做不同的事情

  • register
    • 用一次模块传一次配置,比如这次调用是 AModule.register({age:20}),下一次就是 BModule.register({aaa:2})
  • forRoot
    • 配置一次模块用多次,比如 AModule.forRoot({age:20}) 一次,之后就一直用这个 Module 配置,一般在 AppModule 里 import
    • forRootAsync 就是在配置时,有异步操作,比如需要异步拿到服务配置,才能进行静态配置的生成
  • forFeature
    • 使用了 forRoot 固定整体模块,用于局部的时候,可能需要再传一些配置,比如用 forRoot 指定了数据库链接信息,再用 forFeature 指定某个模块访问哪个数据库和表。

标签:系列,进阶,自定义,register,Module,Nestjs,模块,装饰
From: https://www.cnblogs.com/jsonq/p/18058140

相关文章

  • DBeaver 23.2 最新版 全系列版本、全平台(Win+Mac+Linux)永久激活破解!
    DBeaver简介DBeaver是一个SQL客户端和数据库管理工具。对于关系数据库,它使用JDBCAPI通过JDBC驱动程序与数据库交互。对于其他数据库(NoSQL),它使用专有数据库驱动程序。它提供了一个编辑器,支持代码完成和语法高亮。它提供了一种插件体系结构(基于Eclipse插件体系结构),允许用户修改应......
  • RT-THREAD的STM32F4系列移植
    RT-Thread:RT-Thread,全称是RealTime-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,但允许多个任务同时运行并不意味着处理器在同一时刻真的执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务......
  • 【学习笔记】 - 基础数据结构 :Link-Cut Tree(进阶篇)
    前言LCT没题写可以去写树剖和一些线段树合并的题练手LCT的概念原本的树剖是对树进行剖分,剖分为重边和轻边LCT则是对于树分为虚边和实边,特殊的,LCT可以没有虚边(例:银河英雄传说v2)单独被包含在一个实链里的点称作孤立点在树剖中,我们使用线段树/树状数组来维护重链在Link-Cut......
  • 多线程系列(十五) -常用并发工具类详解
    一、摘要在前几篇文章中,我们讲到了线程、线程池、BlockingQueue等核心组件,其实JDK给开发者还提供了比synchronized更加高级的线程同步组件,比如CountDownLatch、CyclicBarrier、Semaphore、Exchanger等并发工具类。下面我们一起来了解一下这些常用的并发工具类!二、常用并发......
  • 第六章 面向对象进阶
    一,分包思想1、分包思想概述(理解)如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理2、包的概述(记忆)包本质上就是文件夹创建包多级包之间使用"."进行分割多级包的定义规范:公司的网站地址翻转(去掉w......
  • golang进阶之接口
    目录一、接口二、为什么要使用接口三、接口的定义四、实现接口的条件五、接口类型的变量1.值接收者实现接口2.指针类型接收者实现接口3.接口进阶示例六、同一个类型实现多个接口七、多个类型实现同一个接口八、类型中的嵌套去实现接口九、接口嵌套十、空接口1.空接口的定义2.......
  • 第六十八天 BBS项目之四 分组连表查询 路由匹配进阶使用
    一、内容回顾#1登录页面搭建-bootsrtap的栅格,form-group,input:form-control-验证码#2验证码图片的生成-1pillow生成一张图片-2图片上写文字-3设置文字大小,设置文字颜色,设置文字字体格式(ttf)-45位大小写字母,数字-5点,线,弧形-6放到bytesio,取出来 img.save(f,'p......
  • kubenetes系列-部署csi-driver-nfs
    1、部署helm#这里要注意因为下周的是二进制直接可用,需要根据系统去下载wgethttps://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gztarxfhelm-v3.14.2-linux-amd64.tar.gz&&cdlinux-arm64&&mvhelm/usr/bin/2、使用helm部署helmpullcsi-driver-nfs/csi-driver-nfs......
  • 【RS】最新欧空局Sentinel-2卫星数据下载(哨兵1、2、3、5P、6系列)
    ​        之前分享过Sentinel2数据下载的方法,但是有粉丝反应欧空局的网站更新了,之前的网站已经不能用了。所以自己抽空研究了一下新版的欧空局网站,今天就和大家分享一下如何使用新版的欧空局网站下载哨兵系列的卫星数据,本文以Sentinel2数据下载为例。1.前言   ......
  • 2024-03-06 Module '"@nestjs/platform-express"' has no exported member 'Expr
    问题描述:nestjs后端开发,遇到跨域问题,打算用express来配合处理,结果引入express的一个模块失败。app.modules.tsimport{MiddlewareConsumer,Module,NestModule}from'@nestjs/common';import{AppController}from'./app.controller';import{AppService}from'.......