Firebase存储-如何解决当多个用户更新一个文件而不覆盖其他用户的更改?

b5buobof  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(112)

我使用Firebase存储,在那里我存储json文件,例如用户列表,其中包含一些详细信息,如下所示:

{
"1sVy3yHuxHcIihT1IJGpInKgu": {
"username": "David",
"email": "david@gmail.com",
"events": [
"1680093058892",
"1680095016534"
],
"role": "ADMIN"
},
"x9DT96y9Xrc9t3nC5R2ME9CSq": {
"username": "Sara",
"email": "sara@gmail.com",
"events": [],
"role": "USER"
}
}

此文件可以通过多个操作(添加新用户、更新当前用户的数据等)进行更新。要更新文件,我先下载文件,然后进行更改,再将其上载回来,这样会覆盖旧文件。但当同时进行多个更改时,一个用户可能会覆盖其他用户所做的更改。如何解决此问题?

7kjnsjlb

7kjnsjlb1#

正如Alex已经评论过的,这听起来像是一个更适合处理结构化数据的工具的场景,比如Firestore或RealtimeDatabase。
在使用云存储时,我能想到的最好方法是使用规则的元数据和Firebase的服务器端security rules实现自己的比较和设置机制。所需步骤:
1.在每个文件的元数据中包含版本号,例如version: 1
1.更新文件时:
1.记住文件的当前版本号。
1.更新应用程序代码中的数据。
1.确定新版本号,例如version: 2
1.用更新的版本号以前的版本号写入新数据,例如version: 2, previous_version: 1
1.在安全规则中,仅当request.resource(更新后的文件)变量的previous_versionresource(更新前的文件)变量的version相同时才允许写入。
大致是这样的:

allow write: if request.resource.previous_version == resource.version

这样,服务器将拒绝基于过时版本的写入,客户端可以捕获该错误并重试其更新(因此重新读取数据,然后重试)。
以上就是Firebase SDK for the Realtime Database和Firestore在运行事务时所做的事情。

相关问题