InjectionToken:Nest 无法解析依赖关系

InjectionToken: Nest can't resolve dependencies

我有一个 CheckModule,它使用常量 CHECK_OPTIONS:

forRoot 方法中接受配置
@Module({})
export class CheckModule {
  static forRoot(options?: CheckOptions): DynamicModule {
    return {
      module: CheckModule,
      providers: [
        {
          provide: CHECK_OPTIONS,
          useValue: options,
        },
        CheckService,
      ],
      exports: [CheckService],
    };
  }
}

我的 CheckService 使用选项:


@Injectable()
export class CheckService {
  ...

  constructor(@Inject(CHECK_OPTIONS) options: CheckOptions) {}

  ...

每当我调试应用程序时,一切正常。但是,一旦我为生产构建并在 Heroku 上提供它,我就会收到一个错误。

# Production build
nx build $PROJECT_NAME --prod
# Serving the app
node dist/apps/worker/main.js

我收到一个错误:

ERROR [ExceptionHandler] Nest can't resolve dependencies of the CheckService (?). Please make sure that the argument CHECK_OPTIONS at index [0] is available in the CheckModule context.

我是不是漏掉了什么?我有点不知所措...

看来您的模块需要是全局的。 尝试在 @Module({}).

之前添加 @Global() 装饰器

在我的 app.module 中,我将 CheckModule 导入为:

imports: [
  CheckModule.forRoot(),
  ...
]

此方法有一个可选参数 CheckOptions:

forRoot(options?: CheckOptions) { ... }

但是我的 CheckService 需要一个 CHECK_OPTIONS,它 不是 可选的。这就是导致错误的原因。将此 InjectionToken 正确标记为 @Optional() 解决了此问题。

所以,我更改了代码:

  constructor(@Inject(CHECK_OPTIONS) options?: CheckOptions) {}

收件人:

  constructor(@Optional() @Inject(CHECK_OPTIONS) options?: CheckOptions) {}
              ^^^^^^^^^^^

有关 @Optional() 装饰器的更多信息,请参阅 https://docs.nestjs.com/providers#optional-providers

我遇到了同样的问题,通过移动将所有提供程序添加到动态模块的导出来修复它。在你的情况下添加: 出口:[{ 提供:CHECK_OPTIONS, 使用价值:选项, }, 检查服务]