【问题标题】:How to correctly update the user stored data in a full stack app? [closed]如何在全栈应用程序中正确更新用户存储的数据? [关闭]
【发布时间】:2020-12-23 04:13:07
【问题描述】:

前提

手头的问题是多方面的。在实际生产环境中遵循的过程是什么,在安全性与生产成本方面什么被认为是更好的解决方案等。
我目前正在开发一个使用 Redux 来存储应用程序状态树的 React Web 应用程序。同时,我正在使用 Spring Boot 创建一个 RESTful API 作为后端服务器,React 应用程序可以依赖它来进行各种操作。我将用户数据(无论是身份验证、元数据和应用程序特定数据)存储在 Firestore 中,只能由 Spring 后端访问(出于安全原因)。当用户正确登录 React App 时,会发送一个 GET 请求以从 Firestore 获取他们的数据。

困境

现在,当用户在登录时更改其数据时,我面临以下两难境地。

  • 要么更新本地状态,特别是在 Redux 中,然后发送一个 POST 请求来更新 存储在 Firestore 中的数据,
  • 或者,直接从一开始就分派 POST 请求,然后分派另一个 GET 请求以获取更新后的状态。

优点和缺点

  • 第一种方法在用户体验方面似乎更好,因为用户会立即获得他的操作已完成的视觉反馈(例如,他想从帖子列表中删除帖子,帖子会立即被删除)。本地存储负责应用程序的呈现,因此无论等待 POST 请求完成,用户都将正确更新。当然,这也不是很好,因为当数据库中的实际数据尚未更新时修改本地存储根本不安全或真正同步。

  • 第二种方法,它引入了一个可能很费力的操作,可能(或可能不会)需要很长时间才能结束。但是状态将始终正确,或者至少只要 Firestore 数据库具有未损坏的表示形式。

综上所述,您对既能满足用户体验又能满足安全性的正确方法有何看法。 (请记住,本地存储永远不会作为与数据库同步的基础。如果本地存储被篡改或损坏,更改将永远不会到达数据库。)

【问题讨论】:

    标签: reactjs spring-boot performance google-cloud-firestore react-fullstack


    【解决方案1】:

    当您使用客户端 Firestore SDK 时,这两种方法实际上是以相同的方式实现的。

    您将调用 API 来更新文档,然后它会立即为您拥有的任何本地 listeners 触发事件,甚至在将更新发送到服务器之前。当它从服务器获得响应时(如果设备离线,可能会延迟很多时间),客户端要么更新本地缓存的元数据以反映状态,要么(如果写入失败/被拒绝)将本地数据恢复到正确的状态。

    在您的 UI 中,您可以只显示触发到本地事件的数据(这是大多数应用程序所做的),也可以反映元数据。后者采用DocumentSnapshot.metadata 中的两个标志的形式。从那里:

    • hasPendingWrites: True 如果快照包含尚未提交到后端的本地写入结果(例如 set()update() 调用)
    • fromCache: True 如果快照是根据缓存数据创建的,而不是保证最新的服务器数据。

    查看文档链接了解完整详情。

    【讨论】:

    • 通过您的回答和您链接的文档,我了解到我正在搜索的术语是“延迟补偿”。我将通过首先在本地范围内反映更改来实现您建议的方式,如果服务器端发生错误,则恢复这些更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2012-06-12
    • 2021-09-01
    相关资源
    最近更新 更多