我对此不知所措。我无法从Web应用程序或通过Firebase控制台删除Firebase中的节点。通过set(null)
或remove()
删除/ courses / {courseId} / members / {uid}节点后,将立即添加用户信息。
我确实有两个更新seats
节点的云函数,因此我们可以跟踪空间,但是这些都没有指向../{uid}
端点。我还检查了我的Web应用程序代码,以确保没有on_delete
个事件写入树。 有什么线索吗?
更新
在提交树中向后移动后,我能够确认它是下面的云函数,不允许从树中删除。因此,我的问题现在变成了,此功能中的什么导致了该行为?我看不到任何会重写数据的东西。我的数据库结构如下。
/课程参考
courses: {
someStringId1234: {
members: {
uid12345: {
code: 'someString',
email: 'some@email.com'
},
uid67890: { ... }
},
seats: 10
},
{ ... }
}
此云功能监视uid
项目的更改。它获取父节点(members
),然后更新seats
中的计数。由于某种原因,这是在重写先前删除的密钥并将其设置为0。
countRegistration,firebase云功能
exports.countRegistrations = functions.database.ref('/courses/{courseId}/members/{uid}').onWrite(
(change) => {
// get the `members` node for the item
const collectionRef = change.after.ref.parent;
console.log('collectionRef', collectionRef)
// get the `seats` key for updating
const countRef = collectionRef.parent.child('seats');
console.log('countRef', countRef)
let increment;
// If the ID is there after but not before, remove one seat
if (change.after.exists() && !change.before.exists()) {
increment = -1;
// if the ID is not there after, but there before, add one seat
} else if (!change.after.exists() && change.before.exists()) {
increment = 1;
} else {
// Nothing to change
return null;
}
// Return the promise from countRef.transaction() so the function
// waits for this async event to complete before it exits.
return countRef.transaction((current) => {
console.log('Line 38', current) // debugging, confirms the correct refs are grabbed by the function
return (current || 0) + increment;
}).then(() => {
return
});
});
只是为了好玩,这是当我尝试直接在控制台中删除节点时发生的情况。数据库规则允许您在登录后进行写操作。
答案 0 :(得分:1)
我遇到了同样的问题,我刚刚解决了它。发生错误是由于它正在使用的节点数据。 请检查当前使用节点的位置,然后中断或注销。然后,可以删除该节点。
说明::如果该节点是用户信息,并且当前用户已登录,则无法删除该节点。不断地,只要删除节点,就重新创建节点。
答案 1 :(得分:0)
我有同样的问题。事实证明,删除该节点将导致太多的Firebase函数无法执行。尝试在CLI中使用delete命令,它可能会为您提供有关该错误的更多信息。 firebase database:remove <//path to node>
答案 2 :(得分:0)
在这种情况下,我正在使用处理程序将我的活动刷新延迟2-3秒,如果有人遇到此错误,请确保:-
请勿刷新活动或显示(重新加载数据库)
使用处理程序延迟2-3秒,然后登录的用户将无法自动重新制作节点。
我以前如何删除节点:-
<div v-if='park.parkCity == "paris" || == "london" '>
更新:
在进行更多工作之后,我发现我也遇到了相同的错误,因为使用了addValueEventListener <,在这种情况下,它是在删除数据库或在数据库中添加某些东西时自动添加数据,如果您使用addListenerForSingleValueEvent,那么将会添加或删除数据时没有任何问题。
最终结论:
addValueEventListener(如果您希望每次发生任何添加或删除操作时刷新页面
addListenerForSingleValueEvent(如果您不想在添加或删除内容时刷新页面)