Триггер Firebase возвращает другой ключ узла для вызова обновления - PullRequest
0 голосов
/ 11 июня 2018

Моя структура базы данных выглядит следующим образом.Я пытаюсь написать триггер Firebase, который при обновлении любой части узла / SCORES получит RoundScore для PlayerID и обновит существующую запись.

"SCORES" : {
       "2017" : {
         "Round_1" : {
           "3" : {
             "Emoji" : "",
             "PlayerName" : "Person A",
             "RoundScore" : 100
               },
           },
       },
   },

"SELECTIONS" : {
    "2015" : {
      "Round_1" : {
        "TEAM A" : {
          "18" : {
            "emoji" : " ",
            "playerName" : "Person A",
            "position" : "POS"
          },
          "19" : {
            "emoji" : " ",
            "playerName" : "Person B",
            "position" : "POS"
          }
     },
        "TEAM B" : {
          "54" : {
            "emoji" : " ",
            "playerName" : "Person C",
            "position" : "POS"
          },
          "89" : {
            "emoji" : " ",
            "playerName" : "Person D",
            "position" : "POS"
          }
     },
        "TEAM C" : {
          "227" : {
            "emoji" : " ",
            "playerName" : "Person E",
            "position" : "POS"
          },
          "234" : {
            "emoji" : " ",
            "playerName" : "Person F",
            "position" : "POS"
          }
     },
        "TEAM D" : {
          "239" : {
            "emoji" : " ",
            "playerName" : "Person G",
            "position" : "POS"
          },
          "280" : {
            "emoji" : " ",
            "playerName" : "Person H",
            "position" : "POS"
          }
        }
      }
    }
  }
}

Итак, что я хочубаза данных, которая будет выглядеть после триггера.

"SCORES" : {
        "2017" : {
          "Round_1" : {
            "3" : {
              "Emoji" : "", <------------ DUPLICATE FROM HERE
              "PlayerName" : "Person A",
              "RoundScore" : 100 <------------ AND HERE
                },
            },
        },
    },

    "SELECTIONS" : {
        "2015" : {
          "Round_1" : {
            "TEAM A" : {
              "3" : {
                "emoji" : "", <------------ INSERT HERE
                "playerName" : "Person A",
                "position" : "POS"
                "RoundScore" : 100 <------------ AND HERE
              },
            },
        },
    }

Пока что написанное мной работает только для жестко закодированного teamID (TEAM A в приведенном выше примере).

exports.whenScoresUpdate = functions.database
    .ref('/SCORES/{yearId}/{roundId}/{playerId}')
    .onCreate((snap, context) => {  
        const newScoreData = snap.val();
        const yearId = context.params.yearId;
        const roundId = context.params.roundId;
        const playerId = context.params.playerId;
        const scoreObj = {
            "RoundScore" : newScoreData.RoundScore,
            "Emoji" : newScoreData.Emoji,
        }; 
    return admin.database().ref('/SELECTIONS/' + yearId + '/' + roundId + '/{teamId}/' + playerId).update(scoreObj);

1 Ответ

0 голосов
/ 11 июня 2018

Вы действительно недалеко от этого!Следующий код должен работать.Вот пара замечаний:

  • Поскольку вы хотите запускать ", когда любая часть узла / SCORES" обновляет", вы должны использовать другой триггер, onCreate(),как onUpdate().Обратите внимание, что тогда вы должны использовать change.after.val(); вместо snap.val();.
  • Вы должны найти способ установить значение teamId.Это не будет работать: ...roundId + '/{teamId}/' + playerId....
  • Вы должны поймать любую возможную Promise.reject из update()

    exports.whenScoresUpdate = functions.database
      .ref('/SCORES/{yearId}/{roundId}/{playerId}')
      .onUpdate((change, context) => {

        const newScoreData = change.after.val();

        const yearId = context.params.yearId;
        const roundId = context.params.roundId;
        const playerId = context.params.playerId;

        const teamID = "A"; //<- adapt according to your needs

        const scoreObj = {
            "RoundScore": newScoreData.RoundScore,
            "Emoji": newScoreData.Emoji,
        };

        return admin.database().ref('/SELECTIONS/' + yearId + '/' + roundId + '/' + teamId + '/' + playerId).update(scoreObj)
            .catch(error => {
                console.log(error);
                //...
            });

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