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
