node.js - Firebase 实时数据库返回空值,TypeError: row is null
问题描述
我要做的是通过nodejs应用程序从firebase实时数据库中获取数据,并从那里允许前端直接向我的节点应用程序而不是firebase发出请求。我向 firebase 数据库发出了请求,就像下面的代码一样,但它返回一个空值,当前端读取这个值时,它会生成一个错误。我已经检查了 firebase 数据库并且没有空值。Firebase 会按应有的方式返回所有数据,但它总是返回这个“null”,就像下图一样。
{
"data": [
null,
{
"data": "12/04/2016",
"subtitulo": "test...",
"titulo": "test"
},
{
"data": "05/05/2019",
"subtitulo": "test...",
"titulo": "test"
},
{
"data": "02/01/2020",
"subtitle": "title",
"title": "test"
}
]
}
节点JS代码:
db.ref('myreference/here/').once('value', (snapshot) => {
data = snapshot.val();
return res.json({
data,
});
});
解决方案
虽然 Firebase 实时数据库本身并不存储数组,但它的 API 和 SDK 尝试优雅地处理源数据中的数组。当您存储一个数组时,它们会将其转换为带有顺序数字键(、、等)的 JSON"0"
映射"1"
。然后你从数据库中读回这样的结构,他们将其转换为数组。
最后一个动作就是您在代码中看到的:由于您的键看起来像数组索引,因此客户端将数据转换为数组。并且由于"0"
缺少 key,它会null
为此在数组中插入一个元素。
规避这种数组强制的最简单方法是为您的键添加前缀,例如:
"Avisos": {
"key1": { ... },
"key2": { ... },
"key2": { ... },
}
这将确保 Firebase API/SDK 不会将数据强制转换为数组。
一般来说,我建议不要使用顺序数字键(Kato 在Best Practices: Arrays in Firebase中给出了很好的概述),而是使用Firebase 的push()
方法生成的键。
推荐阅读
- python - 我们如何寻找/向后搜索存储在 Django 后端的视频文件?
- reactjs - 当鼠标悬停在 Material UI 中的日期字段上时,如何显示手形符号(光标指针)?
- amazon-web-services - 解决ecs中docker容器中使用php时重定向过多的错误
- apache-kafka - 如何在使用 Kafka 事件时使用 TopicRecordNameStrategy 过滤主题中的 avro 事件?
- python - 在 wsgi.py 中无法访问环境变量
- azure-data-factory - 有没有办法从数据流活动中捕获“错误详细信息”?
- javascript - 当 sweetalert2 打开时,jQuery keydown 事件不起作用
- php - 我可以在 php 中编写一个带有多个可选参数但至少要使用一个参数的函数吗?
- python - 问题理解子类python的行为
- javascript - 如何检查画布图像是纯黑色还是纯白色