Firebase 存储 - 如何解决多个用户在不覆盖其他用户更改的情况下更新一个文件的问题?



我使用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的服务器端安全规则来实现自己的比较设置机制。所需步骤:

  1. 在每个文件的元数据中包含一个版本号,例如version: 1

  2. 更新文件时:

    1. 请记住文件的当前版本号

    2. 更新应用程序代码中的数据

    3. 确定新版本号,例如version: 2

    4. 用更新后的版本号写入新数据以前的版本号,例如version: 2, previous_version: 1

  3. 在您的安全规则中,只有当request.resource(更新后的文件)变量的previous_versionresource(更新前的文件)的version相同时才允许写入。

    类似以下语句的内容:

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

这样,服务器将拒绝基于过时版本的写操作,客户端可以捕获该错误并重试更新(因此重新读取数据,然后再试一次)。

以上就是当你运行一个事务时,用于实时数据库和Firestore的Firebase sdk所做的事情。

相关内容

最新更新