如何通过Cloud Functions删除Firebase Storage对应Firestore文档的关联文件夹
问题根因
你收到的对象不存在报错,是因为Google Cloud Storage 本身不存在真实的文件夹实体,你在控制台看到的文件夹层级,只是系统根据文件路径的前缀虚拟生成的展示效果,你代码中尝试删除的ListingImages/{listingId}/本身并不是一个实际存在的存储对象,因此会触发不存在的错误。
实现方案
你需要先检索出路径前缀为ListingImages/{listingId}/的所有存储文件,再批量删除这些文件即可达成删除整个文件夹的效果,修正后的代码如下:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.listingImagesDelete = functions.firestore.document("listings/{listingId}").onDelete(async (snapshot, context) => { const listingId = snapshot.id; // 定义要匹配的路径前缀 const filePrefix = `ListingImages/${listingId}/`; const defaultBucket = admin.storage().bucket(); // 检索所有前缀匹配的文件 const [targetFiles] = await defaultBucket.getFiles({ prefix: filePrefix }); // 批量执行删除操作 const deleteTasks = targetFiles.map(fileItem => fileItem.delete()); return Promise.all(deleteTasks); });
注意事项
- 常规场景下上述代码可以直接使用,如果单个listing关联的图片超过1000张,需要额外处理
getFiles的分页逻辑,否则只会删除前1000个匹配到的文件 - 如果你修改过Cloud Function的默认服务账号权限,需要确认服务账号持有
storage.objects.delete权限,否则会删除失败
内容的提问来源于stack exchange,提问作者Rene Alas
相关产品推荐
相关产品推荐

