Использование Nestjs для опроса изменений БД - PullRequest
0 голосов
/ 31 октября 2019

Я ищу вариант использования nest в качестве внутренней службы шлюза -

Идея состоит в том, чтобы опросить изменения БД (и, возможно, позже, чтобы переместить их в управляемую событиями) - де-факто не слушательпотребуется здесь. При изменении Nest будет обновлять вызовы API 3-го пункта

Что было бы лучше здесь?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Я бы лично использовал подписчиков typeORM, как я делал это много раз для аналогичных требований. Однако я использую eventEmitter, чтобы не блокировать действие сохранения. Это фрагмент того, что я обычно делаю.

@Injectable()
export class EntityUpdate implements EntitySubscriberInterface {
  constructor(
    @InjectConnection() readonly connection: Connection,
    @InjectEventManager() emitter: AppEvents<AbstractEntity>,
  ) { 
    connection.subscribers.push(this);
  }

  afterInsert(event: InsertEvent<AbstractEntity>): void {
    this.emitter('entity', {
      method: 'update',
      entity,
    });
  }
}

Затем я могу прослушать событие в любом месте моего приложения и обработать это изменение статуса объекта

0 голосов
/ 31 октября 2019

Посмотрите здесь, я делаю что-то похожее на то, что вам нужно: https://github.com/nerdybeast/sith-api/blob/feature/redis-cache/src/modules/api/sobjects/trace-flag/TraceFlagPoller.ts

Я создал класс, который "опрашивает" серверную часть и генерирует событие, когда обнаруживает изменение вэтот бэкэнд. У вас может быть другой код, который прослушивает это событие, которое вызывает ваш API стороннего производителя.

ОБНОВЛЕНИЕ:

Как вы сказали, в Nest есть базовый контекст приложения, который пропускает службу httpнастройку, вот как вы можете это сделать:

index.ts

import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './ApplicationModule';
import { DatabaseService } from './DatabaseService';

(async () => {

    const app = await NestFactory.createApplicationContext(ApplicationModule);
    const databaseService = app.get<DatabaseService>(DatabaseService);

    await databaseService.poll();
})();

DatabaseService.ts

@Injectable()
export class DatabaseService {

    private expectedResult: any;

    public async poll() : Promise<void> {

        const result = await getData();

        if(result !== this.expectedResult) {
            this.expectedResult = result;
            await axios.post('https://some-url.com', result);
        }

        //Poll every 5 seconds or whatever
        setTimeout(() => this.poll(), 5000);
    }
}

Это может быть решением, если вам придется опроситьбазы данных вместо возможности подписаться на нее. При таком подходе, когда вы запускаете приложение, оно будет опрашивать вечно, постоянно обновляя ваши сторонние API.

Я бы начал index.ts файл с pm2 или forever, чтобы вы могли иметьизящный перезапуск, если ваш процесс по какой-то причине падает.

...