使用 Firebase 处理未定义的值

Posted

技术标签:

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

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

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

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

对此有何想法或建议?

非常感谢!

【问题讨论】:

【参考方案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,
);

【讨论】:

以上是关于使用 Firebase 处理未定义的值的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 输入字段值未定义

Redux state props 值未定义

GPIO 输出寄存器位值未更新

角度形式的密码值未定义

变量传递不起作用 - 值未定义

Mongoose 所需的验证器失败值未定义