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,
使用价值:选项,
},
检查服务]
我有一个 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, 使用价值:选项, }, 检查服务]