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:

没有问题。

合理的设计

  • 重新设计代码,避免循环依赖的产生是最好的做法。
  • 可以引入新的中间件、库或服务来分解复杂的依赖关系。
相关推荐
梨子同志4 分钟前
PostgreSQL
后端
Geek-Chow1 小时前
微服务认证与授权:01 — 概念
java·前端·数据库
AskHarries1 小时前
用 OpenClaw 做视频脚本:选题、分镜、旁白和镜头表
后端·程序员
狂炫冰美式1 小时前
凌晨睡不着,我给台风巴威写了个追踪网站
前端·后端·github
程序员cxuan1 小时前
Claude Code 焚诀(一):Claude Code 六种心智模型
人工智能·后端
雪隐2 小时前
用Flutter做背单词APP-01服务器?不存在的,我家里就有
前端·人工智能·后端
huangjiazhi_2 小时前
纯C++实现ini文件操作
java·后端·spring
用户2204603958682 小时前
ES模块和commonJS两种标准下中实现__dirname?一篇文章教你理清楚
前端
犹豫的大炮3 小时前
jQuery最核心的基础设施之一——数据缓存模块进化史
前端·缓存·jquery
小碗细面3 小时前
从 PRD 到上线:SpecKit 如何让 AI 真正参与前端交付
前端·ai编程·claude