Angular 使用Rxjs或任何东西监听角度中的DB数据更改

Angular 使用Rxjs或任何东西监听角度中的DB数据更改,angular,rxjs,observable,Angular,Rxjs,Observable,我在后端(node.js)有一个服务,我通过angular订阅它 http客户端服务,工作正常。对于我的申请,有多个UER以便其他用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。这样所有用户都可以查看一致的数据,即与数据库数据同步的数据。 我在角度服务中使用RXJS可观测设备。在回答之前,请注意满足您的要求说起来容易做起来难。在现有的基础设施上实现这一点需要大量的工作,如果您确实需要这样做,那么最好在服务器端使用现有的框架 使用HTTP的方法 HTTP不是此任务的正

我在后端(node.js)有一个服务,我通过angular订阅它 http客户端服务,工作正常。对于我的申请,有多个UER以便其他用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。这样所有用户都可以查看一致的数据,即与数据库数据同步的数据。
我在角度服务中使用RXJS可观测设备。

在回答之前,请注意满足您的要求说起来容易做起来难。在现有的基础设施上实现这一点需要大量的工作,如果您确实需要这样做,那么最好在服务器端使用现有的框架

使用HTTP的方法 HTTP不是此任务的正确协议类型。它是基于请求/响应的,希望客户知道何时请求信息

如果必须使用HTTP,我只能想到两种方法

选项1:创建一个永不关闭的HTTP请求,即在express中,服务器从不发送
res.end()
或类似的内容。这种方法还需要一个自定义HTTP客户机,因为默认的HTTP客户机希望在向订阅者发送任何通知之前结束请求。但是,如果没有从服务器发送数据,浏览器可能会终止请求,因此您必须自己实现一个keep-alive

选项2:使用“轮询”——这意味着您不断询问服务器数据是否已更改。这可以通过以下方式在RxJS中实现:

interval(1000).pipe
  switchMap(() => this.http.get(...)
)
这带来了一个巨大的缺点,即您的服务器(以及您的数据库)必须处理大量请求,并且您的网络流量增加(尽管只发送小的包)但是,这可能是最容易实现的,因为几乎不需要更改任何内容来支持这一点。请注意,如果同时有太多的用户,服务器和数据库将在某个时候停机

使用WebSocket的替代方法 浏览器只支持这么多协议,因此满足您需求的解决方案数量有限。一个是WebSocket。它基本上是通过浏览器的TCP协议,但允许使用服务器将数据推送到客户端的选项进行长期连接。RxJS中甚至有一个类,名为
WebSocketSubject

现在,这种方法比任何HTTP方法都具有更好的扩展性,但可能需要重建后端的大部分。如果您想更深入地了解这一点

关于数据库的说明
到目前为止,我们只讨论了网络通信,当然,您的数据库还必须支持可观察的API(轮询方法除外)。您需要查看特定数据库系统的文档,以确定它是否存在。

请从@ggrading获得答案