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:

没有问题。

合理的设计

  • 重新设计代码,避免循环依赖的产生是最好的做法。
  • 可以引入新的中间件、库或服务来分解复杂的依赖关系。
相关推荐
⑩-6 分钟前
VUE3学习
前端·javascript·vue.js
Mr Xu_10 分钟前
Vue 3 中使用 mitt 实现组件间通信的实践与解析
前端·javascript·vue.js
呃m19 分钟前
更好地使用Google Chrome
前端·chrome
巧克力芋泥包20 分钟前
Vue3 详情页跨页循环(上一条,下一条)导航功能实现
前端·javascript·vue.js
XXOOXRT27 分钟前
基于SpringBoot-验证码
java·spring boot·后端
我爱娃哈哈28 分钟前
SpringBoot + ELK + MDC:分布式系统日志追踪,快速定位跨服务调用链问题
spring boot·后端·elk
前端之虎陈随易37 分钟前
前端通用插件开发工具unplugin v3.0.0发布
前端·typescript
Ashley_Amanda38 分钟前
SAP调用Web Service全流程详解
java·前端·数据库
Dreamy smile40 分钟前
css :nth-child() 完全用法指南
前端·css
Southern Wind42 分钟前
从零开始封装一个优雅的图片上传组件 - 二次改装 Layui-Upload 的教程(附完整封装代码)
前端·javascript·html·layui·css3