#cron #nestjs #constructor-injection
Вопрос:
Я пытаюсь создать супер простую задачу cron
@Injectable()
export class CronService {
constructor(
@Inject(forwardRef(() => PurchaseService))
private purchaseService: PurchaseService) {}
@Cron('45 * * * * *')
handleCron() {
this.purchaseService.handleOldPurchases();
}
}
когда я определяю службу в модуле в imports
разделе, она запускается только в том случае, если я удаляю инъекцию службы покупки, если я добавляю ее в providers
раздел — она просто не запускается в производстве 🙁
@Module({
imports: [
CronService,
],
запускает cron — но бросает Nest can't resolve dependencies of the CronService (?). Please make sure that the argument PurchaseService at index [0] is available in the CronService context.
@Module({
providers: [
CronService,
],
вообще не работает
Комментарии:
1.docs.nestjs.com/modules говорит импорт: список импортированных модулей, экспортирующих поставщиков, которые требуются в этом модуле
CronService
, является поставщиком, поэтому вы должны добавить его вproviders
массив его модуля.2. попробуйте следовать образцу, который они написали: github.com/nestjs/nest/tree/…
3. вы правы, это должен быть поставщик, но добавьте его в список поставщиков — он работает на моей локальной машине, но не на производстве, действительно странно …
Ответ №1:
Предполагая, что вы PurchaseService
находитесь в том же модуле, что и CronService
Услуги по закупкам:
@Injectable()
export class PurchaseService {
handleOldPurchases() {}
}
Кронсервис:
@Injectable()
export class CronService {
constructor(private _purchaseService: PurchaseService) {}
@Cron('45 * * * * *')
handleCron() {
this._purchaseService.handleOldPurchases();
}
}
Хрономодуль:
@Module({
providers: [CronService, PurchaseService]
})
export class CronModule {}
Если вы CronService
и PurchaseService
находитесь в разных модулях, содержащий PurchaseService
модуль должен предоставлять и экспортировать PurchaseService
, а потребляющий модуль PurchaseService
должен импортировать PurchaseModule
Схема покупок:
@Module({
providers: [PurchaseService], // this tells the interpreter this module offers PurchaseService
exports: [PurchaseService] // this tells the interpreter for those modules that import PurchaseModule can have access to PurchaseService
})
export class PurchaseModule {}
Хрономодуль:
@Module({
imports: [PurchaseModule] // this tells the interpreter this module require some services in PurchaseModule
providers: [CronService],
})
export class CronModule {}
Наконец, используйте функцию forwardRef() только в том случае и только в том случае, если службы взаимозависимы, т. Е. Служба A использует методb() службы B, в то время как служба B также использует методa службы A. ИМХО, вам следует изо всех сил стараться избегать такого рода связи.
Если вам нужна дополнительная помощь, NestJS discord: https://discord.com/invite/nestjs
Комментарии:
1. Я использовал провайдеров без forwardRef, по какой-то неясной причине это хорошо работает в разработке, но совсем не работает в производстве, если только мой cron не находится в импорте, кроме того, все примеры на nestjs показывают добавление как импорт, что немного сбивает с толку