Firebase доступ к базе данных в реальном времени массив данных с удаленного узла

#javascript #firebase-realtime-database #google-cloud-functions #firebase-admin

#javascript #firebase-realtime-database #google-cloud-функции #firebase-администратор

Вопрос:

Я удаляю узел FRTDB, я хочу получить доступ к удаленным данным с этого узла. функции выглядят следующим образом:

 exports.events = functions.database.ref('/events/{eventId}').onWrite(async (change, context) => {
  const eventId = context.params.eventId
  if (!change.after.exists() amp;amp; change.before.exists()) {
    //data removed
    return Promise.all([admin.database().ref(`/events/${eventId}/dayofweek`).once('value')]).then(n => {
      const pms = []
      const days = n[0]
      days.forEach(x => {
        pms.push(admin.database().ref(`${change.before.val().active ? 'active' : 'inactive'}/${x.key}/${eventId}`).set(null))
      })
      return Promise.all(pms)
    });
   else {
    return null;
  }
})
  

Проблема, с которой я сталкиваюсь, заключается в том, что

admin.database().ref(`/events/ ${EventID}/dayofweek

не зацикливайте данные, потому что кажется, что данных больше нет, поэтому forEach не работает. Как я могу получить доступ к этим данным и получить цикл удаленных данных?

Ответ №1:

Конечно, вы не сможете прочитать данные, которые были только что удалены. Функция запускается после завершения удаления. Если вы хотите получить только что удаленные данные, вы должны использовать change.before , как описано в документации:

Объект изменения имеет before свойство, которое позволяет проверять, что было сохранено в базе данных в реальном времени до события. Свойство before возвращает DataSnapshot, где все методы (например, val() и exists()) ссылаются на предыдущее значение. Вы можете снова прочитать новое значение, либо используя исходный DataSnapshot, либо прочитав after свойство. Это свойство при любом изменении является другим DataSnapshot, представляющим состояние данных после того, как произошло событие.

Ответ №2:

Данные, которые были удалены из базы данных, фактически включены в вызов вашей облачной функции. Вы можете получить, если из change.before .

 exports.events = functions.database.ref('/events/{eventId}').onWrite(async (change, context) => {
  const eventId = context.params.eventId
  if (!change.after.exists() amp;amp; change.before.exists()) {
    //data removed
    days = change.before.val().dayofweek;
    ...
})