【问题标题】:Access all children on node and update them for Firebase Function访问节点上的所有子节点并为 Firebase 功能更新它们
【发布时间】:2018-11-04 20:07:23
【问题描述】:

我在我的实时数据库的一个节点上检测到一些递归,我想删除(或设置 tu 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);
        });
    });
});

基本上它应该迭代表单节点内的所有记录并删除其用户/表单属性。

但是通过访问这个 url 调用该函数:https://.cloudfunctions.net/cleanForms 给了我这个错误:

错误:无法处理请求

这就是我在日志中看到的:

10:47:57.818 PM cleanForms 函数执行耗时 13602 毫秒,完成 状态:'连接错误'

表单节点的记录少于 3,000 条,但正如我之前提到的,它有一些递归。我不知道它是否由于它的大小或与之相关的原因而失败。

【问题讨论】:

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


    【解决方案1】:

    您正在使用 HTTPS 云函数:因此您必须“在最后向客户端发送响应”(观看 Doug Stevenson 的官方视频了解更多详情: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);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2018-09-22
      相关资源
      最近更新 更多