我有一个使用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中的记录仍然可以正确删除,但是不会删除存储中的文件。
我的错误是什么?从存储中删除文件的速度太慢,以至于我需要以其他方式来处理,或者我的代码出错了?