Задания Cron NestJS импортируются без внедрения службы

#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 показывают добавление как импорт, что немного сбивает с толку