typescript - Kör NestJS-schema utan att starta HTTP-servern


Jag försöker skapa en "worker" för NestJS, som i princip samlar data från flera datakällor. Eftersom jag distribuerar denna worker i en Kubernetes-kluster behöver jag inte starta NestJS interna HTTP-server, men schemaläggaren körs inte utan app.listen.

main.ts:

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

bootstrap();

worker.module.ts

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

data.scrapper.ts

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

Svar #1

I grunden är NestJS ett modulärt ramverk som erbjuder starka DI-funktioner till Node/TS-ekosystemet. En modul på hög nivå kan exponeras på ett av tre sätt:

  • En HTTP-server
  • En mikrotjänst
  • Ett applikationskontext t.ex. en uppstartad DI-behållare

Du kan uppnå det du vill genom att skapa din applikation som en mikrotjänst med en anpassad strategi. Jag kommer troligtvis att paketera detta mönster som en del av @golevelup/nestjs-ekosystemet (ansvarsfriskrivning, jag är författaren) eftersom jag har stött på detta mönster med ökande frekvens på sistone.

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: new KeepAliveStrategy(),
  });

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

Detta kommer att hålla din arbetare vid liv och låta den korrekt svara på NestJS livscykelhändelser