【发布时间】:2017-07-05 04:46:47
【问题描述】:
我从 Firebase 数据库中删除元素时遇到问题。结构如下(只是一个示例):
{
"users":
[
{
"id": 0,
"name": "Toma Broome"
},
{
"id": 1,
"name": "Boyd Bolens"
}
]
}
我正在获取用户列表,连接是这样的:
firebase.database().ref("/users/").on("value", snap => {
users = snap.val();
console.log( users ); // pay attention to this line
usersLoop();
});
然后我在屏幕上渲染元素并尝试删除一个:
firebase.database().ref(`/users/${targetEl}`).remove();
如果我检查 Firebase 控制台,该元素实际上已从数据库中删除,但用户数组包含 undefined 值,删除一些元素后它返回一个对象而不是数组。
这是删除数据库第一个位置的三个元素后的控制台。我的意思是我得到了完整的用户列表(我正在使用 JSON 文件上传),我删除了第一个元素,然后在 DOM 中重新呈现所有其他元素。然后我再次删除第一个元素,最后当我第三次删除第一个元素时,我从 firebase 获得了一个对象,显然没有呈现任何内容,因为代码需要一个数组
(5) [undefined × 1, Object, Object, Object, Object]
(5) [undefined × 2, Object, Object, Object]
Object {3: Object, 4: Object}
您还可以看到,当数据库中的元素较少时,数组会一直返回 5 的长度。
我正在考虑的一个选项是使用 Lodash 从返回的集合中删除未定义的元素和/或将其转换为数组,但这将违背应用程序展望未来的任何可扩展性选项。
最后,似乎比什么都奇怪的是,数据库结构似乎突然发生了变化,而视觉上一直保持原来的样子。
这是firebase上数据库的结构
-users
|-0
|-id:0
|-name:value
|-otherprops:value
|-1
|-id:1
|-name:value
|-otherprops:value
【问题讨论】:
-
Firebase 既不存储也不返回数组:firebase.googleblog.com/2014/04/…
-
@cartant 虽然您认为 Firebase 不存储数组是正确的,但它在许多情况下返回的存储值数组看起来像一个数组。但是删除项目会搞砸。事实上,这个问题中的情况已经被博文中的 sn-p “然而,如果我们随后删除 a、b 和 d”所明确涵盖。
-
如果其他人对“看起来像数组”的含义感兴趣,请查看source。
标签: javascript firebase firebase-realtime-database