通过云功能交易无法正常运行Firebase实时数据库多位置更新

时间:2019-04-04 00:43:31

标签: firebase firebase-realtime-database google-cloud-functions

我得到了一个Firebase实时数据库(js sdk),在其中我为每个位置(组/位置/项目/ {locationId} / usercount)计数用户。在根级别,我还有一个用户列表,其中每个用户都有一个位置列表。在这些位置的每个位置中,我都有一个计数器,用于对该位置的用户总数进行计数(用户/ {userId} /组/位置/项/项/ {locationId} /用户数)。

a)因此,每当将用户添加到groups / location / Items / {locationId} / users的位置时,groups / location / Items / {locationId} / usercount的计数器都会增加。

b)同时,对于在users / {userId} / groups / location / Items /中具有此位置的每个用户,在users / groups / location / Items / {locationId} / usercount上的计数器也会增加。 / p>

在下面,您将找到json数据结构以及应该增加两个计数器(a和b)的云函数。该功能的(a)部分可以正常运行。至于(b)部分,它仅适用于刚添加到组/位置/项目/ {locationId} /用户(根据json的用户yjXidCKJuYZ71TNzYe9ob5Raaub2)上的用户,而不适用于用户/ {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 :(得分:0)

这可以解决问题:

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

这将为添加到位置的每个用户增加一个计数器。交易成功后,它将该计数器值复制到具有此位置的每个用户。