使用Firebase云功能删除文件

时间:2018-07-27 11:10:35

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

我有一个使用Firestore的应用程序。用户可以将文件上传到Firebase存储。每个文件都可以由Firestore中的多个文档引用。为了管理引用每个文件的文档数量,我使用了实时db记录,这些记录具有该文件的路径和引用计数器。要管理参考计数器,我有2个云功能:

export const onDocumentCreate = functions.firestore
    .document('/collections/{collection}/documents/{document}')
    .onCreate((snapshot, context) => {
        const rtdb = admin.database();
        const document = snapshot.data();

        console.log(`onDocumentCreate() path: /files/${document.fileKey}`);

        // Run a transaction to update the file referencecount
        return rtdb.ref(`/files/${document.fileKey}`).transaction((post: FileDoc) => {
            if (post) {
                post.referenceCount++;
            }
            return post;
        });
    });

export const onDocumentDelete = functions.firestore
.document('/collections/{collection}/documents/{document}')
.onDelete((snapshot, context) => {
    const rtdb = admin.database();
    const document = snapshot.data();

    console.log(`onDocumentDelete() path: /files/${document.fileKey}`);

    // Run a transaction to update the file referencecount
    const rtdbRef = rtdb.ref(`/files/${document.fileKey}`);
    return rtdb.ref(`/files/${document.fileKey}`).transaction(async (post: FileDoc) => {
        if (post) {
            post.referenceCount--;

            if (post.referenceCount <= 0) {
                if (post.referenceCount < 0) console.log('referenceCount < 0');

                await admin.storage().bucket().file(post.path).delete(); // Remove file from storage
                await rtdbRef.remove();                                  // Remove file node from rt db
            }
        }
        return post;
    });
});

应用程序使用referenceCount = 0创建实时记录,然后每次调用OnDocumentCreate时,引用计数都会增加。通过应用程序删除文档后,将调用onDocumentDelete并减少引用计数器。当referenceCount达到0时,文件和实时记录将被删除。

当以合理的速度创建和删除Firestore文档时,这很好用。但是,如果我强调它并进行大量创建和删除操作,则onDocumentDelete将开始超时。但是,实时db中的记录仍然可以正确删除,但是不会删除存储中的文件。

我的错误是什么?从存储中删除文件的速度太慢,以至于我需要以其他方式来处理,或者我的代码出错了?

0 个答案:

没有答案