使用 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 不会将带有 null
或 undefined
的密钥存储为值,然后如果您想稍后更新它,它将失败。如果您希望路径在更改后保留或保留此类键,请将它们设置为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 处理未定义的值的主要内容,如果未能解决你的问题,请参考以下文章