我正在尝试根据文档注入自定义提供程序:
https://docs.nestjs.com/fundamentals/custom-providers
我的服务:
@Injectable({scope: Scope.REQUEST})
export class ReportService implements OnModuleInit {
private readonly reportRepository: Repository<Report>;
constructor(
public config: ConfigService,
private readonly moduleRef: ModuleRef,
@Inject('CONNECTION') connection: Connection,
) {
console.log(connection);
}
...
app.module.ts
:
const connectionProvider = {
provide: 'CONNECTION',
useValue: connection,
};
@Module({
imports: [
ReportModule,
...
],
providers: [connectionProvider],
controllers: [AppController],
})
export class AppModule implements NestModule {
这样做会导致:
Error: Nest can't resolve dependencies of the ReportService (ConfigService, ModuleRef, ?). Please make sure that the argument at index [2] is available in the ReportModule context.
我想念什么?
答案 0 :(得分:0)
如果provider
在定义它的模块之外可用,则需要将其添加到模块定义(exports
)的app.module
中。使用它的另一个模块(report.module
)需要将该模块添加到其imports
定义中。
app.module.ts
const connectionProvider = {
provide: 'CONNECTION',
useValue: Connection,
};
@Module({
imports: [
ReportModule,
...
],
providers: [connectionProvider],
exports: ['CONNECTION'],
controllers: [AppController],
})
export class AppModule implements NestModule {}
report.module.ts
@Module({
imports: [
AppModule
],
providers: [],
controllers: [],
})
export class ReportModule implements NestModule {}
在您的情况下,这会产生循环依赖关系,需要解决。
由于app.module
似乎是您的核心模块,您可以将其设为global,但仍需要导出提供程序。
或者,我发现最好不要在app.module
中定义任何提供程序,而只使用DynamicModule
(例如forRoot
和forFeature
静态启动器函数)作为提供程序实例化所需的内容,但这似乎不在此问题范围内。