Firebase函数如何在特定时间后从实时数据库中删除节点并从存储中删除文件

时间:2018-08-20 12:11:56

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

我是使用Firebase函数的新手。
7天后(以时间戳计算),我想从数据库中删除“帖子”节点,然后,从“评论”和“反应”中删除所有引用该帖子的节点。之后,如果帖子的photoVideoPath是Firebase Storage的引用,我想从我的存储中删除该对象。 我的数据库结构是:

Post: {
       PostKey: {
                 date: xx/xx/xxxx
                 timestamp: xxxxxxxx
                 photoVideoPath: xxxxxxxxxx
                 title: xxxxxxxxxxx
                }
        [...]
       }

Comment: {
           PostKey: {
                      date: xx/xx/xx
                      hours: xx:xx
                      user: idUser
                      text: xxxxxxxxxx
                     }
           [...]
         }

Reaction: {
            PostKey: {
                       type: xxxxxx
                       user: idUser
                     }
             [...]
           }

我写的代码是:

exports.deleteOldItems = functions.database.ref('/Post/{pushId}').onWrite((change) => {
    const ref = change.after.ref.parent; // reference to the parent
    const now = Date.now();
    const cutoff = now - CUT_OFF_TIME;
    ref.orderByChild('timestamp').endAt(cutoff).once('value', res => {
        // create a map with all children that need to be removed
        const updates = {};
        res.forEach(child => {
            updates[child.key] = null;
        });

        ref.update(updates);

        functions.database.ref('/Reaction/').child(res.key).remove();
        functions.database.ref('/Comment/').child(res.key).remove();

        if (!res.val().photoVideoPath.startsWith("data:image/") && !res.val().photoVideoPath.startsWith("http")) {
            const filePath = res.val().title + res.val().data.replace("/", "").replace("/", "") + res.val().photoVideoPath
            const bucket = googleCloudStorage.bucket('xxxxxxx.appspot.com')
            const file = bucket.file(filePath)

            file.delete().then(() => {
                return console.log(`Successfully deleted photo`)
            }).catch(err => {
                return console.log(`Failed to remove photo, error: ${err}`)
            });
        }
    });
});

我在做什么错?谢谢大家,祝你有美好的一天

1 个答案:

答案 0 :(得分:0)

您不会关注update()和remove()返回的承诺。另外,您不能正确使用delete()返回的promise。实时数据库触发器函数必须返回一个仅在函数中的所有其他异步工作完成后才能解决的承诺。

要了解有关如何将诺言与Cloud Functions结合使用的更多信息,请考虑遵循此处的教程:https://firebase.google.com/docs/functions/video-series/