代码之家  ›  专栏  ›  技术社区  ›  Santhosh

使用RXJS或其他方法监听DB数据在角度上的变化

  •  0
  • Santhosh  · 技术社区  · 6 年前

    我在后端有一个服务(node.js),我通过angular订阅它 HTTP客户端服务,工作正常。对于我的应用程序,有多个用户。 所以其他用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。 因此,所有用户都可以查看一致的数据,即与数据库数据同步的数据。 我在Angular服务中使用RXJS Observables。

    1 回复  |  直到 6 年前
        1
  •  2
  •   ggradnig    6 年前

    在回答问题之前,要知道满足你的要求是说起来容易做起来难。为现有的基础结构实现这一点需要做大量的工作,如果您确实需要这样做,那么最好在服务器端使用现有的框架。

    使用HTTP的方法

    HTTP不是此任务的正确协议类型。它是基于请求/响应的,并期望客户知道 什么时候? 它想请求信息。

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

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

    选项2: 使用“轮询”——这意味着您经常询问服务器数据是否发生了变化。这可以在RXJS中通过以下方式实现:

    interval(1000).pipe
      switchMap(() => this.http.get(...)
    )
    

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

    WebSockets的替代方法

    浏览器只支持这么多的协议,所以对于您的需求只有有限的解决方案。一个是 网络套接字 .它基本上是浏览器上的TCP协议,但允许使用服务器的选项进行长时间的连接 向客户提供数据。甚至在RXJS中也有一个类,叫做 WebSocketSubject .

    现在,这种方法比任何HTTP方法都具有更好的扩展性,但可能需要重新构建后端的大部分。如果你想更深入地研究这个问题, you can start here .

    关于数据库的说明

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