GAME TTXD
GAME TTXD

Reputation: 271

Firebase functions getChild value

I am having a problem on firebase functions. What I trying to do is when Items's child gets updated, then I want to get the value of Count and do further calculation, But what I am facing is that the firebase log console always shows an erreor "TypeError: Cannot read property 'val' of undefined".

JSON structure

"VTEST" : {
    "A" : {
      "Count" : 5,
      "Items" : {
        "item1" : "apple"
      },
      "NUMBER" : 5
    },
    "B" : {
      "Count" : 8,
      "Items" : {
        "item1" : "orange;"
      },
      "NUMBER" : 3
    },
    "C" : {
      "Count" : 10,
      "Items" : {
        "item1" : "grape"
      },
      "NUMBER" : 7
    },
    "D" : {
      "Count" : 12,
      "Items" : {
        "item1" : "grava"
      },
      "NUMBER" : 10
    },
    "E" : {
      "Count" : 15,
      "Items" : {
        "item1" : "fish"
      },
      "NUMBER" : 12
    },
    "F" : {
      "Count" : 18,
      "Items" : {
        "item1" : "chicken;"
      },
      "NUMBER" : 8
    }
  }

My code:

exports.ItemCount = functions.database.ref('/VTEST/{ID}/Items').onUpdate((updateRef, context) => {
        var childCount = updateRef.after.numChildren();
        var newReference = updateRef.after.ref.parent.child('/Count');
        var Count = newReference.val();
        Count = Count + childCount;
        return updateRef.ref.update({Count})
    })

What I expect is the Count's value will be update, but it always show error : "TypeError: Cannot read property 'val' of undefined" Can anyone tell me what am I doing wrong here, I don't get it.

Upvotes: 0

Views: 263

Answers (1)

Renaud Tarnec
Renaud Tarnec

Reputation: 83058

The problem comes from the fact that a Reference does not have a val() method. You need to use the once() method to get the value of the corresponding database location.

The following adapted code should work:

exports.ItemCount = functions.database
  .ref('/VTEST/{ID}/Items')
  .onUpdate((updateRef, context) => {
    var childCount = updateRef.after.numChildren();
    var newReference = updateRef.after.ref.parent.child('/Count');
    return newReference.once('value').then(dataSnapshot => {
      var Count = dataSnapshot.val();
      Count = Count + childCount;
      return newReference.parent.update({ Count: Count });
    });
  });

However, depending on your exact requirements, you may decide to use a Transaction, see https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactions

Upvotes: 2

Related Questions