firebase realtime database calling set with new properties

时间:2018-09-22 22:39:38

标签: firebase firebase-realtime-database angularfire2

i am using firebase realtime DB with my ionic app and using angularfire2. I have data stored like:

"users" : {
    "230A3lKQqWh0TczOGP8sbtMVpuF2" : {
      "email" : "xxx@gmail.com",
      "isAdmin" : false,
      "name" : "Santosh Yadav",
      "pic" : "https://graph.facebook.com/xxx/picture"
    },
    "oSEYj0zrkhPCk9r7uwyOOkHcqe53" : {
      "email" : "yyy@gmail.com",
      "isAdmin" : true,
      "name" : "Vik Kumar",
      "pic" : "https://graph.facebook.com/xxx/picture"
    },
    "tl3uvseaBeWVYFCTwSngUqcSokX2" : {
      "email" : "zzz@gmail.com",
      "isAdmin" : false,
      "name" : "Neeti Singhal",
      "pic" : "https://graph.facebook.com/xxx/picture"
    }
}

We ended up to store more user data like date of birth and date of aniversary and when we try to update it as below:

createUser(user:User){
    console.log('start of create user')
    var payload = {
      "name": user.name,
      "email": user.email,
      "pic" : user.pic,
      "dob" : user.dob,
      "anivDate" : user.anivDate,
    }

    return this.db.object('/users/' + user.uid).set(payload).then(
      (resp) => console.log("user created")
    ).catch(
      (err) => console.log("issues creating user:" + err)
    )
  }

It fails with error:

ERROR Error: Reference.set failed: First argument contains undefined in property 'users.oSEYj0zrkhPCk9r7uwyOOkHcqe53.anivDate'
    at validateFirebaseData (validation.js:113)
    at validation.js:140
    at forEach (obj.js:46)

I understand the error that it is unable to set a property anivDate that does not exist in my firebase realtime DB. This will fix if i manually add the property into the db manually. But that is not a practical fix. So, what is the solution here?

To define the fix: i am expecting to add a new property if that does not exist else just update it.

1 个答案:

答案 0 :(得分:0)

要快速修复,请使用||运算符在undefined元素上设置默认值。用法:

var payload = {
  "anivDate": user.anivDate || "1970-01-01",
  ...
};

这会将anivDate设置为user.anivDate(如果存在),将1970-01-01设置为anivDate。 (这是可行的,但我认为最好的做法是,如果不存在这样的值,则对用户不具有vue-element-loading属性,并在访问数据时检查该值是否存在。)

要获得更可扩展/可靠的修补程序,请使用Firebase's realtime database triggers向新列中添加异步验证或默认值。