如何忽略通过 HTTP 进行更改的客户端的 websocket 事件?

Vit*_*nko 5 architecture rest http websocket reactjs

我们有一个 React 应用程序,它使用 REST 来获取和更新数据,并使用 Websocket 来接收更改通知。

想象我们有一个集合/用户

  1. user1调用http方法POST /users创建新用户
  2. user1 收到肯定的 http 响应,并且创建的用户被添加到 UI 列表中。
  3. user1 还收到 Websocket 通知“user:created”,并再次尝试将新项目添加到 UI 列表中。

因此,由于 HTTP 响应和 WS 事件,发出调用的用户应该两次处理结果。这就是我试图解决的问题。

几种可能的解决方案: 1. 跳过调用 POST /users 的用户的 WS 事件。问题是他可能打开了几个浏览器选项卡。并且全部都不会更新。2. 不处理HTTP响应,仅处理WS事件。

有人遇到过这样的问题吗?还有哪些其他可用解决方案?

zhu*_*ber 3

您基本上已经指出了最佳解决方案(2.),但这里有一些选择

  1. 不要使用 POST 的响应,而是等待“user:created”事件,该事件将更新所有订阅客户端(包括启动 POST 的客户端)的列表 -建议的方法
  2. 使用您当前的实现,但您的 POST 和“user:created”事件应该共享某种标识符,它们与请求的其余部分一起返回,客户端可以使用该标识符来确定他是否已经获得该信息 - 例如“user:created: {用户身份}”。那么只有内存中没有“user:created:{userId}”的客户端才会使用 WS 事件数据。- 不建议
  3. 跳过启动 POST 的用户的 WS 事件 - 问题是如果特定用户连接了多个客户端(选项卡、浏览器 + 移动设备等) - 使用这种方法,您必须跳过客户端的 WS 事件(套接字术语中的connectionId) )发起 POST 请求(不是用户!)。因此,如果用户有 10 个连接,您将向 9 个连接发送“user:created”事件,除了发起请求的连接之外,以及应接收该事件的所有其他连接 - 不推荐,因为它会使您的后端变得非常复杂。

在我看来,最简单、最干净的方法是忽略 POST 响应并等待 WS 事件 - 因为这些是套接字,所以您不应该有任何 UI 问题或延迟。