【问题标题】:Firebase: Can I combine a push with a multi-location update?Firebase:我可以将推送与多位置更新结合起来吗?
【发布时间】:2016-08-14 22:08:57
【问题描述】:

我需要使用生成的密钥创建一个新对象并更新其他一些位置,它应该是原子的。有什么方法可以通过多位置更新进行推送,还是我必须使用旧的事务方法?这适用于任何客户端平台,但这里有一个 JavaScript 示例。

var newData = {};
newData['/users/' + uid + '/last_update'] = Firebase.ServerValue.TIMESTAMP;
newData['/notes/' + /* NEW KEY ??? */] = {
  user: uid,
  ...
};
ref.update(newData);

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    在 Firebase 的 JavaScript SDK 中有两种方法可以调用 push

    1. 使用push(newObject)。这将生成一个新的推送 id 并将数据写入具有该 id 的位置。

    2. 使用push()。这将生成一个新的推送 id 并返回对具有该 id 的位置的引用。这是一个纯客户端操作

    了解 #2,您可以通过以下方式轻松获得新的推送 id 客户端:

    var newKey = ref.push().key(); // on newer versions ref.push().key;
    

    然后您可以在多位置更新中使用此密钥。

    【讨论】:

    • 这个键怎么用?假设我有一个可以计算点击次数的按钮。 Firebase 数据有一个变量 (click_count=21)。所以,如果有人点击按钮,它会创建新的 ID,因为我使用的是第一种方法。我可以有类似那个键的东西,所以无论我添加什么,它都会将它存储在同一个键中。即使我刷新网页。
    • 感谢非常有用的提醒,push() 是客户端操作!
    • 感谢您注意这是客户端操作。 Dart/Flutter 的工作方式相同。
    【解决方案2】:

    我发布这个是为了节省一些未来读者的时间。

    Frank van Puffelen 的回答(非常感谢这个人!)使用key(),但应该是key

    key() 抛出 TypeError: ref.push(...).key is not a function

    另请注意,key 给出了路径的最后一部分,因此您从中获取它的实际 ref 是无关紧要的。

    这是一个通用示例:

    var ref = firebase.database().ref('this/is/irrelevant')
    
    var key1 = ref.push().key // L33TP4THabcabcabcabc
    var key2 = ref.push().key // L33TP4THxyzxyzxyzxyz
    
    var updates = {};
    updates['path1/'+key1] = 'value1'
    updates['path2/'+key2] = 'value2'
    
    ref.update(updates);
    

    这将创建这个:

    {
      'path1':
      {
        'L33TP4THabcabcabcabc': 'value1'
      },
      'path2':
      {
        'L33TP4THxyzxyzxyzxyz': 'value2'
      }
    }
    

    我是firebase的新手,如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多