# #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
есть .
Не рекомендуется размещать транзакции подобным образом. Транзакции по своей природе могут выполняться несколько раз, и нет никакой гарантии, что они завершатся должным образом в зависимости от количества обновлений, которые происходят в одном и том же месте.