Firebase云功能 - 更新节点

时间:2018-01-16 16:36:29

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions

我在我的应用中使用Firebase云功能来计算用户的数量。 我有喜欢的节点,当用户喜欢视频时,它会保存他的ID和布尔参数(true)。

此处示例

enter image description here

在Firebase云功能上,我会收听该节点,当添加新节目时会计算喜欢的节点。 你可以看到"喜欢:3"。

云功能代码 - 更新计数器

   exports.countlikechange = functions.database.ref('/likes/{postid}/{userUID}').onWrite(event => {
const collectionRef = event.data.ref.parent;    
console.log(collectionRef);

const countRef = collectionRef.child('likes');


// Return the promise from countRef.transaction() so our function 
// waits for this async event to complete before it exits.
return countRef.transaction(current => {
  if (event.data.exists() && !event.data.previous.exists()) {
    return (current || 0) + 1;
  }
  else if (!event.data.exists() && event.data.previous.exists()) {
    return (current || 0) - 1;
  }
}).then(() => {
  console.log('Counter updated.');
   });
 });

该方法听取"喜欢"节点和当孩子添加它时触发该方法并更新"喜欢:.."在每个videoID上。

我想要做的是首先我要更新其他节点中的计数器

enter image description here

在该节点上我还想更新计数器。

我的问题是我不知道如何获得对该节点的引用。 在" HipHop"节点,视频已保存,每个视频都以其ID保存。

我如何从云功能引用到该节点并更新"喜欢" ??

修改 另外,我如何从我正在收听的节点中检索数据。

例如我正在倾听"喜欢"节点,我想要检索刚刚在该节点中更新的数据。

1 个答案:

答案 0 :(得分:1)

你可以这样写:

exports.countlikechange = functions.database.ref('/likes/{postid}/{userUID}').onWrite(event => {
const collectionRef = event.data.ref.parent;
const countRef = collectionRef.child('likes');
  const promises = [];
  if (event.data.exists() && !event.data.previous.exists()) {
    const promisseadd1 = countRef.transaction(current => {
      return (current || 0) + 1;
    });
    const promisseadd2 = admin.database().ref(`/enter/here/new/path/likes`).transaction(current => {
      return (current || 0) + 1;
    });
    return Promise.all([promisseadd1, promisseadd2]);
  } else if (!event.data.exists() && event.data.previous.exists()) {
    const promissesubs1 = countRef.transaction(current => {
      return (current || 0) - 1;
    });
    const promissesubs2 = admin.database().ref(`/enter/here/new/path/likes`).transaction(current => {
      return (current || 0) - 1;
    });
    return Promise.all([promissesubs1, promissesubs2]);
  }
});