Module 和 Provider 循环依赖怎么办?

31 阅读1分钟

A 引入B B引入A

新建个项目看下

nest new circular-reference -p npm

image.png

nest g module aaa 
nest g module bbb

image.png

image.png

启动后报错

image.png

如何解决这个问题? 先单独创建这两个 Module,然后再让两者关联起来,使用 forwardRef

image.png

image.png

再次启动不会报错

image.png

原因就在于 nest 会单独创建两个 Module,之后再把 Module 的引用转发过去

除了 Module ,provider 和 Service 也会存在 循环引用


nest g service ccc --no-spec --flat 
nest g service ddd --no-spec --flat

并且互相引用下


import { Injectable } from '@nestjs/common';
import { DddService } from './ddd.service';

@Injectable()
export class CccService {
  constructor(private dddService: DddService) {}

  ccc() {
    return 'ccc';
  }

  eee() {
    return this.dddService.ddd() + 'eee';
  }
}


import { Injectable } from '@nestjs/common';
import { CccService } from './ccc.service';

@Injectable()
export class DddService {
  constructor(private cccService: CccService) {}

  ddd() {
    return this.cccService.ccc() + 'ddd';
  }
}

app.service.ts 使用

import { Injectable } from '@nestjs/common';
import { CccService } from './ccc.service';
import { DddService } from './ddd.service';

@Injectable()
export class AppService {
  constructor(
    private cccService: CccService,
    private dddService: DddService,
  ) {}

  getHello(): string {
    return this.dddService.ddd() + this.cccService.eee();
  }
}

image.png

使用 forwardRef 解决

image.png

image.png

再次启动服务就没问题了

image.png