NestJS provider 和 exports 的区别

Posted by CodingWithAlice on April 5, 2025

NestJS provider 和 exports 的区别

背景:在 AModule 中引入 BModule 后,无法直接使用 BService

解决方案:在 BModule 中通过 exports 导出

// b.module.ts
@Module({
  	providers: [BService], // 错误以为这个是导出
  	exports: [BService], // 🌹--> 其实这个才是导出
    ...
})
export class BModule {}
// a.module.ts
@Module({
    imports: [BModule], // 这里引入 BModule
    ...
})
export class AModule {}
// a.service.ts
@Injectable()
export class AService {
    constructor(
    @InjectModel(A)
     private aModel: typeof A,
     private readonly bService: BService, // 声明 BService
    ) {}
	async findAll(){
        const Bres = await this.bService.findAll(); // 以为可以使用
    }
}

没有区分清楚两个指令的功能:

  • providers 声明就是一种 注册服务,让它可以在当前模块中使用,不是导出功能
  providers: [BService] exports: [BService]
作用 让 NestJS 知道如何创建 BService 允许其他模块使用 BService
可见性 仅当前模块 (BModule) 内部可用 其他导入 BModule 的模块可用
是否必需 是 (必须先在 providers 中声明) 可选 (只有需要共享时才需要导出)