【问题标题】:Firebase real time database returning a null value, TypeError: row is nullFirebase 实时数据库返回空值,TypeError: row is null
【发布时间】:2021-01-19 00:32:59
【问题描述】:

我要做的是通过 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 产生的错误:

【问题讨论】:

  • 你能分享一下firestore中记录的截图吗?
  • 完成!我正在使用实时数据库,@Michael
  • 我的假设是,由于某种原因,您有一个文档是 null,正如文档中所说:“如果引用位置不存在数据,则快照的值为 null”。这里:firebase.google.com/docs/database/admin/retrieve-data#node.js

标签: node.js firebase firebase-realtime-database


【解决方案1】:

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

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

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

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

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

一般来说,我建议不要使用连续数字键(Kato 在Best Practices: Arrays in Firebase 中给出了很好的概述),而是使用keys generated by Firebase's push() method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 2019-05-24
    • 2022-12-14
    • 2020-08-20
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多