使用 Rxjs 或任何东西侦听 Angular 中的数据库数据更改

San*_*osh 3 observable rxjs angular

我在后端(node.js)中有一个服务,我正在通过 angular http 客户端服务订阅它,它工作正常。对于我的申请,有不止一个用户。所以其他一些用户可以更改数据库数据。所以每当数据库数据发生变化时,我都想立即订阅它们。所以所有用户都可以查看一致的数据,即与DB数据同步的数据。我在角度服务中使用 RXJS Observables。

ggr*_*nig 11

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

使用 HTTP 的方法

HTTP 不是执行此任务的正确协议类型。它是基于请求/响应的,并希望客户端知道它何时想要请求信息。

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

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

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

interval(1000).pipe
  switchMap(() => this.http.get(...)
)
Run Code Online (Sandbox Code Playgroud)

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

使用 WebSockets 的替代方法

浏览器仅支持如此多的协议,因此满足您需求的解决方案数量有限。一种是WebSocket。它基本上是浏览器上的 TCP 协议,但允许使用服务器数据送到客户端的选项的长期连接。在 RxJS 中甚至有一个类,称为WebSocketSubject.

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

数据库注意事项

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