В функции firebase cloud дочерний элемент самоудаляется

# #node.js #firebase-realtime-database #google-cloud-functions #firebase-admin

Вопрос:

Когда я добавляю транзакцию в функцию ниже, дочерний элемент «guncelLig» автоматически удаляется. Когда я удаляю вторую транзакцию, проблем нет, она работает очень хорошо.

этот код работает правильно :

     for (let i = 0; i < users.length; i  ) {
      const userID = users[i].id;
      database.ref().child("users").child("profilData").child(userID).child("guncelLig").transaction(function (value) {
        if (value > 1) {
          database.ref().child("users").child("profilData").child(userID).update({
            "lastUpdate": toSwiftDate(),
          });
          return value - 1; 
        }
    
        return value;
      });

}
 

но когда я добавляю новую часть в приведенный ниже код, «guncelLig» полностью удаляется из базы данных firebase в реальном времени:

     for (let i = 0; i < users.length; i  ) {
      const userID = users[i].id;

   database.ref().child("users").child("profilData").child(userID).child("guncelLig").transaction(function (value) {
        if (value > 1) {
          database.ref().child("users").child("profilData").child(userID).update({
            "lastUpdate": toSwiftDate(),
          });

          /// NEW CODE ERROR SOURCHE
database.ref().child("users").child("profilData").child(userID).child("EnYukselLig").transaction(function (EnYukselLig) {
            if (EnYukselLig > value - 1) {
              return value - 1;
            }
            return EnYukselLig;
          });

          return value - 1; // arttır
        }
        return value; /// ALWAYS RETURN NULL
      });
    }
 

Где я делаю что-то не так? пожалуйста, помогите мне

Ответ №1:

Вы должны написать свой код как async/await . С await помощью вы можете дождаться завершения вложенной транзакции.

 for (let i = 0; i < users.length; i  ) {
  const userID = users[i].id;
  database
    .ref()
    .child("users")
    .child("profilData")
    .child(userID)
    .child("guncelLig")
    .transaction(async (value) => {
      if (value > 1) {
        await database
          .ref()
          .child("users")
          .child("profilData")
          .child(userID)
          .update({
            lastUpdate: toSwiftDate(),
          });

        /// NEW CODE ERROR SOURCHE
        await database
          .ref()
          .child("users")
          .child("profilData")
          .child(userID)
          .child("EnYukselLig")
          .transaction(function (EnYukselLig) {
            if (EnYukselLig > value - 1) {
              return value - 1;
            }
            return EnYukselLig;
          });

        return value - 1; // arttır
      }
      // No handler if the value is NULL
      return value; /// ALWAYS RETURN NULL
    });
}
 

Вы также не занимаетесь этим делом, если value оно уже null есть .

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