访问节点上的所有子节点,并更新它们的Firebase功能

时间:2018-11-04 04:57:33

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

我在实时数据库的一个节点上检测到某种递归,我想删除(或设置为null)该特定节点。到目前为止,这是我的firebase函数:

exports.cleanForms = functions.https.onRequest((req, res) => {
    const parentRef = admin.database().ref("forms");
    return parentRef.once('value').then(snapshot => {
        snapshot.forEach(function(child) {
            admin.database().ref('forms/'+child.key+'/user/forms').set(null);
        });
    });
});

基本上,它应该遍历forms节点内的所有记录并删除其user / forms属性。

但是通过转到以下URL调用该函数:https://.cloudfunctions.net/cleanForms给我这个错误:

  

错误:无法处理请求

这是我在日志中看到的:

  

10:47:57.818 PM cleanForms函数执行耗时13602 ms,已完成   状态:“连接错误”

forms节点具有少于3,000条记录,但是正如我之前提到的,它具有一定的递归性。我不知道它是否由于大小或与此有关而失败。

1 个答案:

答案 0 :(得分:0)

您正在使用HTTPs云功能:因此,您必须“最后向客户端发送响应”(观看道格·史蒂文森的官方视频以获取更多详细信息:https://youtu.be/7IkUgCLr5oA) 。

在您的情况下,函数的“结束”将是您的所有set()异步操作都将“完成”时。由于set()方法返回了Promise,因此您必须使用Promise.all()(再次观看此官方视频:https://youtu.be/d9GrysWH1Lc)。

因此,以下方法应该起作用(但是未经测试):

exports.cleanForms = functions.https.onRequest((req, res) => {
    const parentRef = admin.database().ref("forms");
    parentRef.once('value')
    .then(snapshot => {
        const promises = [];
        snapshot.forEach(child => {
           promises.push(admin.database().ref('forms/'+child.key+'/user/forms').set(null));
        });
        return Promise.all(promises)   
    .then(results => {
        response.send({result: results.length + ' node(s) deleted'});
    })
    .catch(error => {
        response.status(500).send(error);
    });
});