Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase-针对脱机情况设置vs更新?_Javascript_Firebase_React Native_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase-针对脱机情况设置vs更新?

Javascript Firebase-针对脱机情况设置vs更新?,javascript,firebase,react-native,firebase-realtime-database,Javascript,Firebase,React Native,Firebase Realtime Database,我有一个评论屏幕,底部有一个评论列表和一个文本框。我有两种使用更新的评论计数保存评论的方法: 1)使用set() 2)使用update() 现在,对于脱机情况,即当客户端与internet断开连接时,如果我在脱机时添加多个注释,以下是两种情况下的情况: set()工作正常。当客户端返回到联机模式时,用户在脱机时添加的所有注释将保存到firebase数据库 但是update()在脱机时似乎不起作用。当客户端返回联机模式时,“计数”值不正确,只有一个键添加到firebase数据库的“comments

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

1)使用set()

2)使用update()

现在,对于脱机情况,即当客户端与internet断开连接时,如果我在脱机时添加多个注释,以下是两种情况下的情况:

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

但是update()在脱机时似乎不起作用。当客户端返回联机模式时,“计数”值不正确,只有一个键添加到firebase数据库的“commentsList”节点

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

从技术上讲,
update()
方法工作正常。它只是没有做你想让它做的事。:-)

离线场景中现在发生的情况是:

  • 脱机客户端添加注释
  • 脱机客户端更新其自己的注释计数
  • 客户端重新联机
  • 客户端将其新注释和自己的注释计数发送到服务器
  • 问题是,另一个客户端可能也在#4之前添加了注释,而您的客户端从未正确更新注释计数

    有许多方法可以解决这个问题,但其中许多方法很快变得相当复杂。到目前为止,最简单的两个是:

  • 使用事务同时添加注释和计数(正如Doug在其注释中所建议的)。这是最简单的解决方案,但在客户端脱机时无法工作
  • 使用云函数增加计数器,如中所示。但由于云功能在谷歌的服务器上运行,这也无法脱机工作
  • 使用Firebase的服务器端安全规则验证,只有当
    commentscount
    中的更改与操作的实际注释中的更改相匹配时,才允许客户端发送更新。这相当复杂,但有一个优点,即当客户端脱机时,它可以工作。在上面的场景中,结果将是服务器拒绝写入,然后您的客户端可以从步骤2重试(在使用服务器的正确值更新注释计数之后)。如果您想研究这条路径,它与我在这里的回答中演示的类似:

  • 增加计数器的唯一安全方法是使用事务,事务仅在联机时才起作用。您最好对数据库进行安全写入,指示计数应该增加,然后使用云函数在后端安全地处理。我以前使用过事务,但我想利用Firebase的脱机模式。因此,首先我使用“value”(一次)获取当前计数,然后更新计数。谢谢@Frank!所以,如果我坚持使用“set”(因为我需要离线功能),这会导致任何问题,或者违反firebase的最佳实践吗?set()现在似乎工作正常。如果多个用户同时发帖,您的实际评论数和计数器将不同步,当他们脱机时,这种情况更可能发生。
    ref.child(commentsList).child(commentKey).set(true);
    ref.child(commentsCount).set(++count);
    
    allCommentKeysArray[newCommentsKey] == true
    var data = {
            commentscount: ++count,
            commentslist: { ...allCommentKeysArray}
        }
    ref.child(path).update(data);