如何在全栈应用程序中正确更新用户存储的数据?
How to correctly update the user stored data in a full stack app?
前提
手头的问题是多方面的。在实际生产环境中遵循的过程是什么,在安全与生产成本等方面被认为是更好的解决方案
我目前正在开发一个 React 网络应用程序,利用 Redux 来存储应用程序的状态树。同时,我正在创建一个 RESTful API 和 Spring Boot 作为后端服务器,React 应用程序可以依赖它进行各种操作。我将用户数据(身份验证、元数据和应用程序特定数据)存储在 Firestore 中,只能由 Spring 后端访问(出于安全原因)。当用户在 React 应用程序中正确登录时,将发送一个 GET 请求以从 Firestore 获取他们的数据。
困境
现在,当用户在登录时更改他们的数据时,我面临以下困境。
- 要么更新本地状态,特别是在 Redux 中,然后发送一个 POST 请求来更新
存储在 Firestore 中的数据,
- 或者,从一开始就直接发送 POST 请求,然后发送另一个 GET 请求来获取更新后的状态。
优缺点
第一种方法似乎在用户体验方面更好,因为用户会立即看到他的操作已完成的视觉反馈(假设他想从post 的列表,post 立即被删除)。本地存储负责应用程序的呈现,因此无论等待 POST 请求完成,用户都将正确更新。当然,当数据库中的实际数据尚未更新时修改本地存储并不完全安全或真正不同步。
第二种方法,它引入了一个可能需要很长时间才能结束的可能很费力的操作。但是状态将始终正确,或者至少只要 Firestore 数据库具有未损坏的表示。
综上所述,您对既能满足用户体验又能保证安全的正确方法有何看法。 (请记住,本地存储永远不会作为与数据库同步的基础进行查找。如果本地存储被篡改或损坏,更改将永远不会到达数据库。)
当您使用 client-side Firestore SDK 时,这两种方法实际上以相同的方式实现。
您将调用 API 来更新文档,然后立即为您拥有的任何本地 listeners 触发事件,甚至在将更新发送到服务器之前。当它从服务器获得响应时(如果设备处于离线状态,可能会在 much 之后),客户端更新本地缓存的元数据以反映状态,或者(如果写入 failed/was 被拒绝)将本地数据恢复到正确状态。
在您的 UI 中,您可以只显示触发到本地事件的数据(这是大多数应用程序所做的),或者您也可以反映元数据。后者在 DocumentSnapshot.metadata 中采用两个标志的形式。从那里:
hasPendingWrites
: True
if the snapshot contains the result of local writes (e.g. set()
or update()
calls) that have not yet been committed to the backend
fromCache
: True
if the snapshot was created from cached data rather than guaranteed up-to-date server data.
查看文档 link 了解完整详情。
前提
手头的问题是多方面的。在实际生产环境中遵循的过程是什么,在安全与生产成本等方面被认为是更好的解决方案
我目前正在开发一个 React 网络应用程序,利用 Redux 来存储应用程序的状态树。同时,我正在创建一个 RESTful API 和 Spring Boot 作为后端服务器,React 应用程序可以依赖它进行各种操作。我将用户数据(身份验证、元数据和应用程序特定数据)存储在 Firestore 中,只能由 Spring 后端访问(出于安全原因)。当用户在 React 应用程序中正确登录时,将发送一个 GET 请求以从 Firestore 获取他们的数据。
困境
现在,当用户在登录时更改他们的数据时,我面临以下困境。
- 要么更新本地状态,特别是在 Redux 中,然后发送一个 POST 请求来更新 存储在 Firestore 中的数据,
- 或者,从一开始就直接发送 POST 请求,然后发送另一个 GET 请求来获取更新后的状态。
优缺点
第一种方法似乎在用户体验方面更好,因为用户会立即看到他的操作已完成的视觉反馈(假设他想从post 的列表,post 立即被删除)。本地存储负责应用程序的呈现,因此无论等待 POST 请求完成,用户都将正确更新。当然,当数据库中的实际数据尚未更新时修改本地存储并不完全安全或真正不同步。
第二种方法,它引入了一个可能需要很长时间才能结束的可能很费力的操作。但是状态将始终正确,或者至少只要 Firestore 数据库具有未损坏的表示。
综上所述,您对既能满足用户体验又能保证安全的正确方法有何看法。 (请记住,本地存储永远不会作为与数据库同步的基础进行查找。如果本地存储被篡改或损坏,更改将永远不会到达数据库。)
当您使用 client-side Firestore SDK 时,这两种方法实际上以相同的方式实现。
您将调用 API 来更新文档,然后立即为您拥有的任何本地 listeners 触发事件,甚至在将更新发送到服务器之前。当它从服务器获得响应时(如果设备处于离线状态,可能会在 much 之后),客户端更新本地缓存的元数据以反映状态,或者(如果写入 failed/was 被拒绝)将本地数据恢复到正确状态。
在您的 UI 中,您可以只显示触发到本地事件的数据(这是大多数应用程序所做的),或者您也可以反映元数据。后者在 DocumentSnapshot.metadata 中采用两个标志的形式。从那里:
hasPendingWrites
:True
if the snapshot contains the result of local writes (e.g.set()
orupdate()
calls) that have not yet been committed to the backend
fromCache
:True
if the snapshot was created from cached data rather than guaranteed up-to-date server data.
查看文档 link 了解完整详情。