#heroku #dependency-injection #nestjs
Вопрос:
У меня есть CheckModule
, который принимает конфигурацию в forRoot
методе, использующем константу CHECK_OPTIONS
:
@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.
Я что-то здесь упускаю? Я вроде как ничего не понимаю…
Комментарии:
1. Являются ли эти параметры файлом .json? Он может быть не включен в dist после сборки. Если да, пожалуйста, проверьте свой файл tsconfig, настроен ли он для их загрузки.
2. Параметры являются необязательными. Пользователь может включить такой модуль
CheckModule.forRoot({ <options here> })
Ответ №1:
Похоже, ваш модуль должен быть глобальным. Попробуйте добавить @Global()
декоратора раньше @Module({})
.
Комментарии:
1. Я не знал
@Global()
декоратора. Описание довольно четкое, но его применение ничего не меняет. Все еще получаю ту же ошибку.2. Попробуйте изменить
CHECK_OPTIONS
значение на строку в обоих@Inject()
случаях и при предоставлении.3. Используйте «CHECK_OPTIONS», я имею в виду
4. У меня это работает. Похоже, я импортировал некоторые модули, которые импортировали некоторые другие неиспользуемые материалы. Рефакторинг этих неверных зависимостей волшебным образом решил эту проблему. До сих пор не знаю, что именно вызвало это, но это работает…
Ответ №2:
В моем app.module
случае я импортировал CheckМодуль как:
imports: [
CheckModule.forRoot(),
...
]
Этот метод имел необязательный параметр для CheckOptions
:
forRoot(options?: CheckOptions) { ... }
Однако мой контрольный сервис ожидает CHECK_OPTIONS
, что a не является необязательным. Это то, что вызвало ошибку. Правильная маркировка этой инъекции как @Optional()
решенной этой проблемы.
Итак, я изменил код с:
constructor(@Inject(CHECK_OPTIONS) options?: CheckOptions) {}
Для:
constructor(@Optional() @Inject(CHECK_OPTIONS) options?: CheckOptions) {}
^^^^^^^^^^^
Видишь https://docs.nestjs.com/providers#optional-providers для получения дополнительной информации о @Optional()
декораторе.