使用Nestjs轮询数据库更改

时间:2019-10-31 10:56:51

标签: nestjs

我正在寻找将Nest用作后端网关服务的选项-

想法是轮询数据库更改(也许以后再将其移至事件驱动)-实际上,这里不需要侦听器。 更改后,Nest会更新第3个pt API调用

这里最好的做法是什么?

2 个答案:

答案 0 :(得分:0)

在这里看看,我正在做与您想要的类似的事情: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.tspm2来启动forever文件,以便在由于某种原因导致进程崩溃时可以正常重启。

答案 1 :(得分:0)

我个人会使用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,
    });
  }
}

然后我可以在应用程序中的任何地方监听事件,并处理实体的状态更改