Обновление базы данных Firebase в реальном времени через транзакции облачных функций не работает - PullRequest
0 голосов
/ 04 апреля 2019

Я получил базу данных реального времени FireBase (JS SDK), где я считаю пользователей для каждого местоположения (группы / местоположение / Предметы / {locationId} / usercount).У меня также есть на корневом уровне список пользователей, где для каждого пользователя у меня есть список местоположений.В каждом из этих местоположений у меня есть счетчик, который подсчитывает общее количество пользователей для этого местоположения (пользователи / {userId} / groups / location / Items / {locationId} / usercount).

a) Поэтому всякий раз, когдаПользователь добавляется в местоположение в группах / location / Items / {locationId} / users, счетчик в groups / location / Items / {locationId} / usercount увеличивается.

b) Одновременно увеличивается счетчик в users / groups / location / Items / {locationId} / usercount для каждого пользователя, который имеет это местоположение в users / {userId} / groups / location / Items/.

Ниже вы найдете структуру данных json, а также облачную функцию, которая должна увеличивать оба счетчика (a и b).Часть (а) функции работает отлично.Что касается части (b), то она работает только для пользователя, который был только что добавлен в groups / location / Items / {locationId} / users (user yjXidCKJuYZ71TNzYe9ob5Raaub2 согласно настоящим json), но не для ВСЕХ пользователей в users / {userId}.

Мне нужна эта функция для увеличения всех счетчиков пользователей внутри пользователей / {userId}, которые имеют местоположение, к которому был добавлен пользователь.

Надеюсь, я достаточно ясен и ДЕЙСТВИТЕЛЬНО оценил бы некоторыепомочь в этом.Может быть, я не должен использовать транзакции.

Большое спасибо!

  "groups" : {
    "location" : {
      "Items" : {
        "NA" : {
          "code" : "NA",
          "created" : "2019-04-03--19:10:11",
          "id" : "NA",
          "label" : "North America",
          "levelIndex" : 1,
          "levelName" : "Continent",
          "type" : "location",
          "usercount" : 2,
          "users" : {
            "Xi6XiXdxDAWqvjmSUeobnhDTe4k2" : {
              "created" : "2019-04-03--19:10:11",
              "id" : "Xi6XiXdxDAWqvjmSUeobnhDTe4k2",
              "ip" : "hidden",
              "label" : "Anonymous"
            },
            "yjXidCKJuYZ71TNzYe9ob5Raaub2" : {
              "created" : "2019-04-03--19:10:11",
              "id" : "yjXidCKJuYZ71TNzYe9ob5Raaub2",
              "ip" : "hidden",
              "label" : "Anonymous"
            }
          }
        }
      }
    }
  },
  "users" : {
    "Xi6XiXdxDAWqvjmSUeobnhDTe4k2" : {
      "created" : "2019-04-03--19:10:11",
      "groups" : {
        "location" : {
          "Items" : {
            "NA" : {
              "code" : "NA",
              "created" : "2019-04-03--19:10:11",
              "id" : "NA",
              "label" : "North America",
              "levelIndex" : 1,
              "levelName" : "Continent",
              "type" : "location",
              "usercount" : 1
            }
          }
        }
      },
      "id" : "Xi6XiXdxDAWqvjmSUeobnhDTe4k2",
      "ip" : "hidden",
      "label" : "Anonymous"
    },
    "yjXidCKJuYZ71TNzYe9ob5Raaub2" : {
      "created" : "2019-04-03--19:10:11",
      "groups" : {
        "location" : {
          "Items" : {
            "NA" : {
              "code" : "NA",
              "created" : "2019-04-03--19:10:11",
              "id" : "NA",
              "label" : "North America",
              "levelIndex" : 1,
              "levelName" : "Continent",
              "type" : "location",
              "usercount" : 2
            }
          }
        }
      },
      "id" : "yjXidCKJuYZ71TNzYe9ob5Raaub2",
      "ip" : "hidden",
      "label" : "Anonymous"
    }
  }
}


exports.onUserAddToLocation = functions.database
.ref('/groups/location/Items/{itemId}/users/{userId}')
.onCreate((snapshot, context) => {
  const itemId = context.params.itemId
  const userId = context.params.userId
  const groupCounterRef = admin.database().ref('/groups/location/Items/' + itemId + '/usercount');


  return groupCounterRef.transaction(usercount => {
    return (usercount || 0) + 1
  }).then(result => {
    const count = result.snapshot.val();
    const userGroupsCounterRef = admin.database().ref('/users/' + userId + '/groups/location/Items/' + itemId + '/usercount');
    userGroupsCounterRef.transaction(usercount => {
      return count
    })
  })
})

1 Ответ

0 голосов
/ 05 апреля 2019

Это делает трюк:

.ref('/groups/location/Items/{itemId}/users/{userId}')
.onCreate((snapshot, context) => {
  const itemId = context.params.itemId
  const groupCounterRef = admin.database().ref('/groups/location/Items/' + itemId + '/usercount');

  return groupCounterRef.transaction(usercount => {
    return (usercount || 0) + 1
  }).then(result => {
    const count = result.snapshot.val();

    const usersRef = admin.database().ref("users").orderByKey();
    usersRef.once("value")
      .then(function(snapshot) {
        snapshot.forEach(function(childSnapshot){
          const userId = childSnapshot.key
          const userLocationCountersRef = admin.database().ref('users/' + userId + '/groups/location/Items/' + itemId)
          const hasThisGroup = childSnapshot.hasChild('/groups/location/Items/' + itemId)
          if(hasThisGroup){
            userLocationCountersRef.update({usercount:count})
          }
      })
    })
  })
})

Это увеличивает счетчик для каждого пользователя, добавленного в местоположение.После успешного завершения транзакции он копирует значение этого счетчика каждому пользователю, у которого есть это местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...