1.处理Module和Module之间的循环依赖
首先新建一个nest
项目,再建立两个module
模块:
js
nest new loop-dependency -p pnpm
nest g module aaa --no-spec
nest g module bbb --no-spec
然后让两个module
相互依赖:
之后启动项目,执行npm run start:dev
:
项目启动后会发现程序报错了: 报错提示的是在解析BbbModule
时,它的第一个import
是undefined
。
这有两种原因,一种是这个值本来就是undefined
,另外一个就是形成了循环依赖。
因为nest
在创建Module
的时候会循环递归创建它的依赖,而它的依赖又依赖了这个module
,所以没法创建成功,拿到的就是undefined
。
为了解决这种问题,我们可以先独立创建这两个module
,然后让他们关联起来。
可以使用forwardref
将其关联起来: 关联成功后,应用就重新运行成功了。
这里nest
会单独创建各自的Module
,然后再将Module
的引用转发过去,也就是forwardref的作用。
2.处理Provider和Provider之间的循环依赖
在service
中可以注入其他的service
,所以可能造成循环依赖。
我们先创建两个service
文件:
js
nest g service ccc --no-spec --flat
nest g service ddd --no-spec --flat
创建这两个service
,并在app.module
中引入:
之后让他们互相引入:
之后在App.service
中调用:
这个时候就发现控制台报错: 原因同样是因为循环依赖。
这个也是通过forwardRef
来解决,修改ccc.service
和ddd.service
:
然后在浏览器访问,可以看到打印出来的信息,正是所期待的,这也就说明service
的循环依赖也解决了: