【问题标题】:Handling undefined Values with Firebase使用 Firebase 处理未定义的值
【发布时间】:2017-07-07 17:57:33
【问题描述】:

我的 Web 应用程序中有一个简单的表单,它将 JSON 对象保存到我的 Firebase 数据库。并非此表单上的每个字段都是必需的,因此在构造要发送的对象时,它可能具有多个undefined 属性。

由于 Firebase 在尝试持久化 undefined 值时会引发错误(更不用说,您不应该在 JSON 对象上有 undefined 值),我想知道框架是否提供了任何方法将所有未定义的值覆盖为null,甚至是一个空字符串;我还没有在网上找到解决方案。

在最坏的情况下,我可以手动将所有未定义的属性设置为 null,但我不想这样做

对此有何想法或建议?

非常感谢!

【问题讨论】:

    标签: javascript json firebase firebase-realtime-database


    【解决方案1】:

    对于使用 Firestore 的用户,现在可以忽略 undefined 字段:https://github.com/googleapis/nodejs-firestore/issues/1031#issuecomment-636308604

    elmasry:截至今天 2020 年 5 月 29 日,Firebase 添加了对使用 { ignoreUndefinedProperties: true } 调用 FirebaseFiresore.settings 的支持。设置此参数后,Cloud Firestore 会忽略对象内部未定义的属性,而不是拒绝 API 调用。

    例子:

    firebase.firestore().settings({
      ignoreUndefinedProperties: true,
    })
    
    await firebase
      .firestore()
      .collection('products')
      .doc(productId)
      .update({
        name: undefined, // Won't throw an error
      })
    

    【讨论】:

      【解决方案2】:

      我的解决方案是简单地将 stringify() 对象与 replacer 结合起来替换所有未定义的值

      obj = JSON.parse(JSON.stringify(obj, function(k, v) {
         if (v === undefined) { return null; } return v; 
      }));
      

      然后我将它转换回带有 JSON parse() 的对象

      【讨论】:

      • 稍微更新语法:obj = JSON.parse(JSON.stringify(obj, (k, v) => v === undefined ? null : v))
      【解决方案3】:

      我不认为有任何特定的方法可以解决这个问题,因为 JSON 的性质是期望传入一个值,在这种情况下可能是“null”或空字符串。

      虽然目前可能很不幸,但我认为最好在客户端处理这个问题,如果没有输入数据,手动添加“null”或空字符串。然后,您可以稍后在 Firebase 中使用类似“snapshot.val() !== null”的方式测试该位置的数据。

      【讨论】:

        【解决方案4】:

        TL;DR:值可以是undefined||null吗? fbRef.set(JSON.stringify(obj))/fbRef.once(snap=>{const obj=JSON.parse(snap.val())}),否则照常。

        要存储具有未定义/未知值的 JSON 对象,请将其字符串化并将其存储到 Firebase,然后解析以恢复它。这将避免不希望的/不可预见的设置/更新错误。

        如果该对象是您的 Firebase 路径的一部分,则继续执行 Kurai 的解决方案。请注意,Firebase 不会将带有 nullundefined 的密钥存储为值,然后如果您想稍后更新它,它将失败。如果您希望路径在更改后保留或保留此类键,请将它们设置为0(注意副作用)。

        【讨论】:

        • 哇,谢谢这真的救了我很多。 JSON.parse(JSON.stringify(data)) 在设置或推送到数据库之前。它只会删除所有未定义的对象键。谢谢大卫
        【解决方案5】:

        Firebase 9 JS SDK 中的重大更改可以这样编写:

        import {initializeApp} from 'firebase/app';
        import {
          initializeFirestore,
        } from 'firebase/firestore/lite';
        
        export const FirebaseConfig = {
          apiKey: 'example',
          authDomain: 'example.firebaseapp.com',
          projectId: 'example',
          storageBucket: 'example.appspot.com',
          messagingSenderId: 'example',
          appId: 'example',
          measurementId: 'example',
        };
        
        const app = initializeApp(FirebaseConfig);
        
        initializeFirestore(app, {
          ignoreUndefinedProperties: true,
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-14
          • 1970-01-01
          • 2018-01-11
          • 2022-06-30
          • 1970-01-01
          相关资源
          最近更新 更多