Запустите планировщик NestJS без запуска HTTP-сервера

#typescript #nestjs #scheduler

#машинописный текст #nestjs #планировщик

Вопрос:

Я пытаюсь создать «worker» для NestJS, который в основном объединяет данные из нескольких источников данных. Поскольку я развертываю этого работника в кластере Kubernetes, мне не нужно запускать внутренний HTTP-сервер NestJS, однако планировщик не запускается без app.listen него.

main.ts:

 async function bootstrap() {
  const app = await NestFactory.create(WorkerModule);
  await app.listen(3030); // <-- I would like to delete this
}

bootstrap();
 

рабочий.модуль.ts

 @Module({
  imports: [
    ScheduleModule.forRoot(),
  ],
  providers: [
    // Scrappers
    DataScrapper,
  ],
})
export class WorkerModule {}
 

данных.Дуэлянт.ц

 @Injectable()
export class DataScrapper {
  @Interval(1000)
  async sync() {
    console.log('fetching...');
  }
}
 

Ответ №1:

По своей сути, NestJS представляет собой модульную структуру, которая обеспечивает мощные возможности DI для экосистемы node / TS. Модуль верхнего уровня может быть предоставлен одним из трех способов:

Вы можете добиться желаемого, создав свое приложение как микросервис с пользовательской стратегией. Я, скорее всего, упакую этот шаблон как часть экосистемы @golevelup / nestjs (отказ от ответственности, я автор), поскольку в последнее время я все чаще сталкиваюсь с этим шаблоном.

 import { CustomTransportStrategy } from '@nestjs/microservices';

class KeepAliveStrategy implements CustomTransportStrategy {
  private closing = false;

  wait() {
    if (!this.closing) {
      setTimeout(this.wait, 1000);
    }
  }

  listen(callback: () => void) {
    callback();
    this.wait();
  }

  close() {
    this.closing = true;
  }
}

async function bootstrap() {
  const workerApp = await NestFactory.createMicroservice(WorkerModule, {
    strategy: KeepAliveStrategy,
  });

  await workerApp.listen(() => console.log('listening'));
}
bootstrap();
 

Это сохранит ваш рабочий ресурс и позволит ему правильно реагировать на события жизненного цикла NestJS

Комментарии:

1.Я обнаружил две проблемы: typescript const app = await NestFactory.createMicroservice(WorkerModule, { strategy: new KeepAliveStrategy(), // new() is required }); typescript wait() { if (!this.closing) { setTimeout(() => this.wait(), 1000); // should be () => this.wait() } }