通过功能查询Firebase实时数据库

时间:2018-12-14 08:01:51

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

我正在使用firebase函数和Admin SDK在事件触发器上实现函数。我试图在有新更新可用时向用户推送通知。因此,当更新版本从当前更改时,我想在用户对象中进行一些更改,并将update_available键设置为true

现在,正在跟踪的事件(update_version)的位置和要更改的数据位于完全不同的对象中。对象模型如下:

|root
  |- app_info
        |- version

  |- users
        |- <uid>
            |- checker
                  |- update_available: true

到目前为止,我还没有实现:

 function setUpdateValueTrue() {
    db.ref().orderByChild("checker/update_available").equalTo("false").once('value', (snapshot) => {
        snapshot.forEach((childSnapshot) => {
          console.log("got in here");
          console.log(childSnapshot.val())
      });
   })
 }

我想这也许是完全错误的。此刻我感到被困住了。任何帮助都非常感谢。我主要关心的是如何绕过uid或通过它查询。

1 个答案:

答案 0 :(得分:1)

以下内容应该起作用(但是未经测试)。

请注意使用Promise.all(),因为您需要并行更新可变数量的users个节点。

exports.versionUpdate = functions.database.ref('/app_info').onUpdate((change, context) => {
    const beforeData = change.before.val(); // data before the update
    const afterData = change.after.val(); // data after the update

    if (beforeData.version !== afterData.version) {

       const promises = [];
       const usersRef = admin.database().ref('/users');

       return usersRef.once('value', function(snapshot) {
          snapshot.forEach(childSnapshot => {
             const uid = childSnapshot.key;
             promises.push(usersRef.child(uid + '/checker/update_available').set(true));
          });
          return Promise.all(promises);
       });

   } else {
      return null;
   }

});