我的firebase数据库结构如下所示:
-events
-uniqueEventId
-endTimeStamp: 1507949100
-active: true
-uniqueEventId2
-endTimeStamp: 1807949100
-active: true
-uniqueEventId3
-endTimeStamp: 1900949100
-active: true
如何实现可以在当前时间之前获取带时间戳的所有事件并将其活动设置为false的云功能。
答案 0 :(得分:3)
在这种情况下,我不确定您希望如何触发云功能。我假设你想要一个HTTP触发器,这样你就可以从浏览器或web钩子中调用它。
这意味着您从基本HTTP-triggered function开始:
exports.updateStatus = functions.https.onRequest((req, res) => {
// ...
res.status(200).send("done");
});
接下来,您需要在此功能中访问实时数据库。为此,您将使用Firebase Admin SDK,这样您就可以在代码中轻松管理访问权限:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.updateStatus = functions.https.onRequest((req, res) => {
// ...
res.status(200).send("done");
});
然后我们到达实际代码来更改数据。这是标准的数据库访问代码,与云功能几乎没有关系。在这种情况下,您需要查询时间戳,循环结果,并设置active
属性:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.updateStatus = functions.https.onRequest((req, res) => {
let now = Date.now();
let query = admin.database().ref("events").orderByChild("timestamp").startAt(now);
query.once("value").then(function(snapshot) {
var promises = [];
snapshot.forEach(function(child) {
promises.push(child.ref.update({ active: false }));
})
Promise.all(promises).then(function() {
res.status(200).send("done");
});
});
});
最后一个代码有点棘手,因为它处理许多异步写操作。在将响应发送到客户端之后,云功能将终止您的功能,因此在完成所有异步写入后,仅发送响应非常重要。我使用了Promise.all()
。有关此异步特性的更多信息,请阅读the documentation,this blog post,并观看this video。
有关详细信息,我建议您学习documentation for the Firebase Admin SDK。