Firebase - 为脱机情况设置vs更新?

时间:2018-05-27 12:49:33

标签: javascript firebase react-native firebase-realtime-database

我有一个评论屏幕,其中包含评论列表和底部的文本框。我有两种方法可以使用更新的评论计数保存评论:

1)使用set()

ref.child(commentsList).child(commentKey).set(true);
ref.child(commentsCount).set(++count);

2)使用update()

allCommentKeysArray[newCommentsKey] == true
var data = {
        commentscount: ++count,
        commentslist: { ...allCommentKeysArray}
    }
ref.child(path).update(data);

现在,对于离线情况,即客户端从互联网断开连接,如果我在离线时添加多个评论,这两种情况都会发生:

set()工作正常。当客户端返回在线模式时,用户在离线时添加的所有注释都将保存到firebase数据库。

但是离线时update()似乎不起作用。当客户返回在线模式时,'计算'值不正确,只有一个键被添加到' commentsList' firebase数据库中的节点。

我想使用update()而不是set(),但update()似乎不适用于离线模式。那么,我应该坚持使用set(),因为我需要实现离线功能,还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

update()方法在技术上可行。它根本不能做你想做的事。 : - )

离线方案现在发生的是:

  1. 离线客户端添加评论
  2. 离线客户端更新自己的评论数
  3. 客户回来了
  4. 客户端将新评论及其评论计数发送至服务器
  5. 问题在于另一个客户端可能也在#4之前添加了评论,而您的客户端从未正确更新评论计数。

    有很多方法可以解决这个问题,但很多方法很快变得非常复杂。迄今为止最简单的两个是:

    1. 使用交易同时添加评论和计数(正如Doug在评论中所建议的那样)。这是最简单的解决方案,但在客户端离线时无法正常工作。
    2. 使用云功能递增计数器,如functions-samples repo所示。但是,由于云功能在Google的服务器上运行,因此也无法脱机工作。
    3. 使用Firebase的服务器端安全规则验证仅当commentscount中的更改与操作的实际注释中的更改匹配时,才允许客户端发送的更新。这非常复杂,但具有在客户端离线时可以正常工作的优势。在上面的场景中,结果将是服务器拒绝写入,然后您的客户端可以从步骤2重试(在使用服务器中的正确值更新注释计数之后)。如果您想调查此路径,则类似于我在此处的回答中所示:https://stackoverflow.com/a/37956590