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:

没有问题。

合理的设计

  • 重新设计代码,避免循环依赖的产生是最好的做法。
  • 可以引入新的中间件、库或服务来分解复杂的依赖关系。
相关推荐
Agent世界8 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
FungLeo8 小时前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
某哈压力大8 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
程序员大阳8 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半8 小时前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳9 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
syyjhchou9 小时前
自己搭企业内部中转站,怎么让请求更容易命中缓存
人工智能·后端·语言模型·aigc
特立独行的猫A9 小时前
Ionic + 仓颉语言的 cj-tauri 开发框架实战:开发精美移动端 APP
java·后端·python
deli0079 小时前
写满 200GB 后 SSD 为什么掉到 95MB/s?SLC 缓存模型实测
前端
SomeOtherTime10 小时前
Rust集合(AI回答)
开发语言·后端·rust