Не удалось обновить многолучевое обновление базы данных Firebase - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь выполнить многолучевое обновление базы данных в реальном времени с использованием облачной функции (js sdk).Параметры обновления построены через цикл forEach.Обновление завершается неудачно со следующим сообщением об ошибке:
Error: Reference.update failed: First argument must be an object containing the children to replace.

Возможно, я близок к решению с учетом console.log:

[{"-LfzkTClUxC9J5y3Ue95/mood/sun":{"value":-75,"votecount":-1},"-LfzkTClUxC9J5y3Ue95/mood/rain":{"value":"7550","votecount":1}}, ... {"-LfzoAT7fPzhWsMpEU7t/mood/sun":{"value":0,"votecount":-1},"-LfzoAT7fPzhWsMpEU7t/mood/rain":{"value":"050","votecount":1}}].

Это моя облачная функция:

exports.updateGroupMood = functions.database.ref('users/{userId}/mood/')
.onUpdate((change, context) => {

const userId = context.params.userId //previous data
const beforeData = change.before.val()  //current data
const afterData = change.after.val()  
const userGroups = admin.database().ref('/users/' + userId +       
'/groups/social/Items'); //user groups to update

return userGroups.once("value")
.then(function(snapshot) {

var updateParams = []

snapshot.forEach(function(childSnapshot){

  const itemId = childSnapshot.key //id of group to update
  const moodRef = admin.database().ref('/groups/social/Items/' + itemId + '/mood/'); //node to update

  var promise = moodRef.once("value").then(function(snapshot) { //get values to update

    const objVal = snapshot.val()

    const previousMood = { // decrement previous values
      value:objVal[beforeData.element].value - beforeData.value,
      votecount:objVal[beforeData.element].votecount - 1,
    }
    const currentMood = { // increment new values
      value:objVal[afterData.element].value + afterData.value,
      votecount: objVal[afterData.element].votecount + 1,
    }  

    const newMood = { // update params definition
      [itemId + '/mood/' + beforeData.element]: previousMood,
      [itemId + '/mood/' + afterData.element]: currentMood,
    }
    return newMood

  });
  // construct update params
  updateParams.push(promise);

});
//get update params
return Promise.all(updateParams);
}).then(function(values) {

console.log(JSON.stringify(values)); //cf console.log in text above

const updateObj = admin.database().ref('/groups/social/Items/')

//update nodes
updateObj.update(JSON.stringify(values))   
})
})

1 Ответ

0 голосов
/ 30 мая 2019

Вы передаете строку обновлений в формате JSON, в то время как вы должны передавать обновления:

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