我正在学习如何使用以打字稿编写的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
}
}
}
}
}
谢谢!
答案 0 :(得分:0)
您尝试使用与onWrite,onUpdate等一起使用的通配符。只要修改,写入,更新或删除路径,就会触发这些功能。使用这些函数,您可以获得传递给您的上下文,然后可以调用context.params。(这将是您的通配符{uid}),查看这些函数的签名。
现在,您要使用cron作业来调用onHTTPRequest函数。在这种函数中,您可以通过自己请求自己传递所需的参数(这些参数是可选参数),请检查该函数的签名。
调用函数时,您将不得不查询Firebase以获取每个用户的UID,然后在其中进行迭代,并在每个用户节点中写入dailyTimeObject。为了避免读取大量数据,您可以在创建用户时保存另一个保存了所有UID的节点,这样,您只需要读取UID即可,而不必读取所有基础数据。
还取决于您的结构,我仍然不知道(仍然不知道为什么您要向每个用户写入相同的数据)。您可以构建自己的ID(UID +日期……之类的东西),然后使用多路径更新将数据一次写入所有用户,而不是遍历所有用户节点并为每个用户获取一个推键。