使用Nestjs轮询数据库更改

使用Nestjs轮询数据库更改,nestjs,Nestjs,我正在寻找一种将nest用作后端网关服务的选项- 我们的想法是对数据库的更改进行轮询(也许以后会将其移动到事件驱动模式)——实际上这里不需要侦听器。 更改时,嵌套将更新第三个pt API调用 这里的最佳做法是什么?看看这里,我正在做一些类似于您所追求的事情: 我创建了一个类,该类“轮询”后端,并在检测到后端中的更改时发出事件。您可以使用其他代码侦听此事件,从而调用您的第三方api 更新: 正如您所说,Nest有一个基本的应用程序上下文,它跳过了http服务设置,下面介绍了如何做到这一点: 索引

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

我们的想法是对数据库的更改进行轮询(也许以后会将其移动到事件驱动模式)——实际上这里不需要侦听器。 更改时,嵌套将更新第三个pt API调用


这里的最佳做法是什么?

看看这里,我正在做一些类似于您所追求的事情:

我创建了一个类,该类“轮询”后端,并在检测到后端中的更改时发出事件。您可以使用其他代码侦听此事件,从而调用您的第三方api

更新:

正如您所说,Nest有一个基本的应用程序上下文,它跳过了http服务设置,下面介绍了如何做到这一点:

索引

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();
})();
从'@nestjs/core'导入{NestFactory};
从“./ApplicationModule”导入{ApplicationModule};
从“./DatabaseService”导入{DatabaseService};
(异步()=>{
const app=wait NestFactory.createApplicationContext(ApplicationModule);
const databaseService=app.get(databaseService);
等待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);
    }
}
@Injectable()
导出类数据库服务{
私人预期结果:任何;
公共异步轮询():承诺{
const result=等待获取数据();
if(结果!==this.expectedResult){
this.expectedResult=结果;
等待axios.posthttps://some-url.com",结果),;
}
//每5秒投票一次
setTimeout(()=>this.poll(),5000);
}
}
如果您必须轮询数据库而不是订阅数据库,那么这可能是一个解决方案。使用这种方法,当您启动应用程序时,它将永远轮询,不断更新您的第三方api


我会用
pm2
forever
启动
index.ts
文件,这样,如果进程因某种原因崩溃,您就可以优雅地重新启动。

我个人会使用typeORM订阅服务器,就像我为类似需求多次使用的那样。但是,我使用eventEmitter不阻止保存操作。这是我通常做的一个片段

@Injectable()
导出类EntityUpdate实现EntitySubscriberInterface{
建造师(
@InjectConnection()只读连接:连接,
@InjectEventManager()发射器:AppEvents,
) { 
connection.subscribers.push(this);
}
afterInsert(事件:InsertEvent):无效{
this.emitter('实体'{
方法:“更新”,
实体,
});
}
}

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

谢谢,我看到的问题是Nest Natural行为基于服务器侦听器来拦截传入呼叫,在我的例子中,后端实际上没有API—它轮询并更新远程实体您是说您需要运行一个进程来轮询数据库的更改,并在这些更改上调用第三方API吗?这个过程不需要公开api?是的,一个轮询DB更改的过程-不涉及控制器前端api-为了方便(相同的代码结构),我更喜欢它基于NestJs,我想它与文档中提到的“应用程序上下文”相关