Nest 循环依赖解决方案:forwardRef 的艺术

Nest 模块之间可以通过 imports 引用其他模块。

那 Module 和 Module 如果相互引用怎么办?

module 之间的循环依赖

创建一个 nest 项目:

bash 复制代码
nest new module-forward -p npm

创建两个 Module:

bash 复制代码
nest g module a
nest g module b

这种相互引用的情况就会报错。

使用 forwardRef 包装函数,该函数返回模块或提供者的引用,而不是直接引用,从而延迟了依赖项的解析:

这时候就没有报错了。

provider 循环依赖

bash 复制代码
nest g service c --no-spec --flat
nest g service d --no-spec --flat

两个 service 分别依赖了对方的方法。

这时候会报错,也是因为循环依赖导致的。

在提供者中通过 @Inject(forwardRef(() => Type)) 来注入依赖:

这样就不会报错了。

我们相互能不能正确获取结果,在 AppService 使用:

访问 localhost:3000:

没有问题。

合理的设计

  • 重新设计代码,避免循环依赖的产生是最好的做法。
  • 可以引入新的中间件、库或服务来分解复杂的依赖关系。
相关推荐
ManageEngineITSM2 小时前
工单优先级怎么定?影响×紧急度矩阵的设计与落地方法
java·大数据·运维·前端·数据库·变更管理
智商网输送线配件2 小时前
电子制造零散耗材补货实战:小批量混批采购平台怎么选才不停机?
大数据·服务器·前端·数据库·自动化
梦帮科技2 小时前
Web 漏洞攻防深度:WAF 规则逃逸技术(畸形分块传输、双重编码)与对抗加固
linux·前端·网络安全·ssl·web
兰亭妙微UI设计公司2 小时前
兰亭妙微软件界面设计公司的解锁按钮设计10大密码
开发语言·前端·javascript
迪幻2 小时前
封装自己的 npm 依赖并存储到个人 GitHub
前端·npm·github
u0111026753 小时前
WebP 转成 PNG 后为什么更大?图片格式转换不等于压缩
前端·javascript·vue.js
万少3 小时前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
白露与泡影3 小时前
Spring Boot 实现验证码:Hutool-captcha、AJ-Captcha、EasyCaptcha 到底怎么选?
java·spring boot·后端
java1234_小锋3 小时前
【技术专题】HTML5 网页技术 - HTML5 列表标签
前端·html·html5
强二小哥帅3 小时前
Kotlin 协程复习笔记
前端