javascript 使用Firebase处理未定义值

wnavrhmk  于 2023-02-07  发布在  Java
关注(0)|答案(6)|浏览(172)

我的Web应用程序中有一个简单的表单,它将JSON对象持久化到我的Firebase数据库中,并不是表单上的每个字段都是必需的,因此当构造要发送的对象时,它可能有几个undefined属性。
由于Firebase在尝试持久化undefined值时会抛出错误(更不用说,JSON对象上不应该有undefined值),我想知道框架是否提供了任何方法来将所有未定义的值覆盖为null甚至空字符串;我还没在网上找到解决办法。
在最坏的情况下,我可以手动将所有未定义的属性设置为null,但我宁愿不这样做
对此有何想法或建议?
多谢!

8wtpewkr

8wtpewkr1#

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

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

示例:

firebase.firestore().settings({
  ignoreUndefinedProperties: true,
})

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

yrwegjxp2#

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

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

然后,我使用JSON parse()将其转换回对象

wa7juj8i

wa7juj8i3#

从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,
});
qvsjd97n

qvsjd97n4#

我不认为有任何特定的方法可以实现这一点,因为JSON的本质是希望传入一个值,在本例中可能是'null'或空字符串。
虽然目前这可能是不幸的,但我认为最好在客户端处理这个问题,如果没有输入数据,则手动添加'null'或空字符串。然后,您可以稍后使用类似'*snapshot.瓦尔()!== null *'的命令在Firebase中的该位置测试数据。

368yc8dk

368yc8dk5#

**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(注意副作用)。

zzoitvuj

zzoitvuj6#

对于寻找通用解决方案来清除空值和未定义值的人来说,这可能会有帮助。
创建一个像这样的helper函数并 Package 你想要清理的对象。

const Obj = {
  key: 'value',
  key2: null, // Warning: null values would be preserved
  key3: undefined
}

function cleanObj(object) {
  return JSON.parse(JSON.stringify(object))
}

const test = cleanObj(Obj)
console.log(test)

相关问题