вызов базы данных Firebase в реальном времени с новыми свойствами - PullRequest
0 голосов
/ 23 сентября 2018

Я использую базу данных Firebase в реальном времени с моим ионным приложением и использую angularfire2.У меня есть данные, хранящиеся как:

"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"
    }
}

Мы закончили тем, что сохранили больше пользовательских данных, таких как дата рождения и дата годовщины, и когда мы пытаемся обновить их, как показано ниже:

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)
    )
  }

Сбой с ошибкой:

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)

Я понимаю ошибку, что не удается установить свойство anivDate, которого нет в моей базе данных реального времени firebase.Это будет исправлено, если я вручную добавлю свойство в БД.Но это не практическое решение.Итак, каково решение здесь?

Чтобы определить исправление: я ожидаю добавить новое свойство, если оно еще не существует, просто обновите его.

1 Ответ

0 голосов
/ 23 сентября 2018

Для быстрого исправления используйте оператор ||, чтобы установить значение по умолчанию для элементов undefined.Использование:

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

Устанавливает anivDate в user.anivDate, если оно существует, 1970-01-01, если его нет.(Это работает, но, по моему мнению, лучше не иметь свойство anivDate для пользователя, если такого значения не существует, и проверять существование этого значения при доступе к данным.)

Для болеемасштабируемое / надежное исправление, используйте триггеры базы данных Firebase в реальном времени для добавления значений асинхронной проверки или значений по умолчанию в новые столбцы.

...