我使用Firebase存储,在那里我存储json文件,例如用户列表的一些详细信息,如:
{
"1sVy3yHuxHcIihT1IJGpInKgu": {
"username": "David",
"email": "david@gmail.com",
"events": [
"1680093058892",
"1680095016534"
],
"role": "ADMIN"
},
"x9DT96y9Xrc9t3nC5R2ME9CSq": {
"username": "Sara",
"email": "sara@gmail.com",
"events": [],
"role": "USER"
}
}
该文件可以通过多个操作(添加新用户,更新当前用户的数据,…)进行更新。要更新一个文件,我先下载它,然后进行修改并上传回来,这样它就会覆盖旧文件。但是,当同时进行多个更改时,一个用户可以覆盖其他用户所做的更改。如何解决这个问题?
正如Alex已经评论的那样,这听起来像是一个更适合处理结构化数据的工具的场景,例如Firestore或Realtime Database。
当使用云存储时,我能想到的最好的方法是使用规则的元数据和Firebase的服务器端安全规则来实现自己的比较设置机制。所需步骤:
-
在每个文件的元数据中包含一个版本号,例如
version: 1
-
更新文件时:
-
请记住文件的当前版本号
-
更新应用程序代码中的数据
-
确定新版本号,例如
version: 2
-
用更新后的版本号和写入新数据以前的版本号,例如
version: 2, previous_version: 1
-
-
在您的安全规则中,只有当
request.resource
(更新后的文件)变量的previous_version
与resource
(更新前的文件)的version
相同时才允许写入。类似以下语句的内容:
allow write: if request.resource.previous_version == resource.version
这样,服务器将拒绝基于过时版本的写操作,客户端可以捕获该错误并重试更新(因此重新读取数据,然后再试一次)。
以上就是当你运行一个事务时,用于实时数据库和Firestore的Firebase sdk所做的事情。