这是我在云功能中的代码:
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”。
这是我的数据库:
如何删除“游戏”下的第一行,所以在这种情况下“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()
多个承诺。