【问题标题】:InjectionToken: Nest can't resolve dependenciesInjectionToken:Nest 无法解析依赖项
【发布时间】:2021-11-07 11:43:51
【问题描述】:

我有一个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.

我在这里遗漏了什么吗?我有点不知所措...

【问题讨论】:

  • 这个选项是 .json 文件吗?构建后它可能不包含在 dist 中。如果是这样,请检查您的 tsconfig 文件是否已配置为加载它们。
  • 这些选项是可选的。用户可以像这样包含模块CheckModule.forRoot({ <options here> })

标签: heroku dependency-injection nestjs


【解决方案1】:

似乎您的模块需要是全局的。 尝试在@Module({}) 之前添加@Global() 装饰器。

【讨论】:

  • 我不知道 @Global() 装饰器。描述很清楚,但应用它不会改变任何东西。仍然出现同样的错误。
  • 尝试在@Inject() 和提供时将CHECK_OPTIONS 更改为字符串。
  • 我的意思是使用“CHECK_OPTIONS”
  • 我已经成功了。好像我正在导入一些模块,这些模块导入了一些其他未使用的东西。重构这些不正确的依赖关系神奇地解决了这个问题。仍然不知道究竟是什么造成的,但它确实有效......
【解决方案2】:

在我的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

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 2016-06-17
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2014-05-03
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多