使用云功能HTTP触发器

时间:2018-11-04 23:16:01

标签: typescript firebase firebase-realtime-database google-cloud-functions

我正在学习如何使用以打字稿编写的Firebase云功能。我想设置一个Cron作业来每天ping我的功能。我希望函数迭代“用户”节点中的每个节点,并将dailyTimeObject推送到每个“用户”节点。但是我不知道是不是有一个用户ID通配符,我可以用它来写用户ID。如您所见,我尝试了{uid},但这只是创建了一个新节点。

这是我的功能:

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
admin.initializeApp()


export const dailyShiftPush = functions.https.onRequest((request, response) => {
    const pushRef = admin.database().ref('/users/{uid}/dailyTimeObject').push();
    const pushKey = pushRef.key

    const currentTime = Date.now()
    const dailyTimeObject = {
        "time": currentTime,
        "entryId": pushKey
    }
    return pushRef.set(dailyTimeObject)
});

这就是我的Firebase实时数据库json树的样子。我希望{uid}节点位于实际的用户ID下。

{
  "users" : {
    "zVfojjhYUqOzM7hfm2ff8yQtozq2" : {
      "clockIn" : {
        "-LQRpr7wrDAn0kcuicnz" : {
          "clockInTime" : 1541303401051,
          "entryId" : "-LQRpr7wrDAn0kcuicnz"
        },
        "-LQU-_MY8z81yJyUkNJ3" : {
          "clockInTime" : 1541339764229,
          "entryId" : "-LQU-_MY8z81yJyUkNJ3"
        }
      },
      "clockOut" : {
        "-LQRprt3OI465av7sOsF" : {
          "clockOutTime" : 1541303404130,
          "entryId" : "-LQRprt3OI465av7sOsF"
        }
      }
    },
    "{uid}" : {
      "dailyTimeObject" : {
        "-LQW1a1w_P0WaYiZevle" : {
          "entryId" : "-LQW1a1w_P0WaYiZevle",
          "time" : 1541373845702
        }
      }
    }
  }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您尝试使用与onWrite,onUpdate等一起使用的通配符。只要修改,写入,更新或删除路径,就会触发这些功能。使用这些函数,您可以获得传递给您的上下文,然后可以调用context.params。(这将是您的通配符{uid}),查看这些函数的签名。

现在,您要使用cron作业来调用onHTTPRequest函数。在这种函数中,您可以通过自己请求自己传递所需的参数(这些参数是可选参数),请检查该函数的签名。

调用函数时,您将不得不查询Firebase以获取每个用户的UID,然后在其中进行迭代,并在每个用户节点中写入dailyTimeObject。为了避免读取大量数据,您可以在创建用户时保存另一个保存了所有UID的节点,这样,您只需要读取UID即可,而不必读取所有基础数​​据。

还取决于您的结构,我仍然不知道(仍然不知道为什么您要向每个用户写入相同的数据)。您可以构建自己的ID(UID +日期……之类的东西),然后使用多路径更新将数据一次写入所有用户,而不是遍历所有用户节点并为每个用户获取一个推键。