首页 > 解决方案 > 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,
      });
    });

当我请求 api 时由 React Js 生成的错误: 当我请求 api 时由 React Js 生成的错误

在此处输入图像描述

标签: node.jsfirebasefirebase-realtime-database

解决方案


虽然 Firebase 实时数据库本身并不存储数组,但它的 API 和 SDK 尝试优雅地处理源数据中的数组。当您存储一个数组时,它们会将其转换为带有顺序数字键(、、等)的 JSON"0"映射"1"。然后你从数据库中读回这样的结构,他们将其转换为数组。

最后一个动作就是您在代码中看到的:由于您的键看起来像数组索引,因此客户端将数据转换为数组。并且由于"0"缺少 key,它会null为此在数组中插入一个元素。

规避这种数组强制的最简单方法是为您的键添加前缀,例如:

"Avisos": {
  "key1": { ... },
  "key2": { ... },
  "key2": { ... },
}

这将确保 Firebase API/SDK 不会将数据强制转换为数组。

一般来说,我建议不要使用顺序数字键(Kato 在Best Practices: Arrays in Firebase中给出了很好的概述),而是使用Firebase 的push()方法生成的键。


推荐阅读