通过云功能删除Firebase中的第一个节点

时间:2017-07-16 12:22:44

标签: javascript firebase firebase-realtime-database google-cloud-functions

这是我在云功能中的代码:

exports.PlayedMinigameSlot = functions.database.ref('/play/slot/{uid}/').onWrite(event => {
    if (!event.data.exists()) {
        return
    }
    const val = event.data.val()
    return db.ref(`/users/${event.params.uid}/server/slot/games/`).limitToFirst(1).once('value').then(function(slotValue) {
        const key = slotValue.key
        const wonIndex = slotValue.val()
        console.log(wonIndex)
        console.log(key)
        return db.ref(`/users/${event.params.uid}/server/slot/games/${key}`).remove().then(snap => {
            return event.data.adminRef.remove()
        })
    })
})

我的控制台首先返回:null(对于wonIndex)而不是“游戏”为“key”。

这是我的数据库:

database

如何删除“游戏”下的第一行,所以在这种情况下“1:1”

1 个答案:

答案 0 :(得分:1)

当您致电limitToFirst()时,您会创建一个查询。当您对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

您的代码需要处理此列表,它目前还没有。

return db.ref(`/users/${event.params.uid}/server/slot/games/`).limitToFirst(1).once('value').then(function(slotValues) {
  if (slotValue.exists()) {
    var location;
    slotValues.forEach(function(slotValue) {
      const key = slotValue.key
      const wonIndex = slotValue.val()
      location = `/users/${event.params.uid}/server/slot/games/${key}`;
    });
    return db.ref(location).remove().then(snap => {
      return event.data.adminRef.remove()
    });

  });
})

这纯粹适用于单个位置。如果您有更多位置,请使用单个多位置更新(null值表示要删除的位置)或使用Promise.all()多个承诺。