我正在寻找将Nest用作后端网关服务的选项-
想法是轮询数据库更改(也许以后再将其移至事件驱动)-实际上,这里不需要侦听器。 更改后,Nest会更新第3个pt API调用
这里最好的做法是什么?
答案 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.ts
或pm2
来启动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,
});
}
}
然后我可以在应用程序中的任何地方监听事件,并处理实体的状态更改