使用 Cloud Functions 删除 Firebase 存储中的文件夹

Delete Folder inside Firebase Storage with Cloud Functions

我想创建一个 Cloud Function,当在 Firestore 中删除对象(列表)时,它会自动删除 FirebaseStorage 中关联的图像。

作为上下文,当创建列表时,我们采用该文档 ID 并将其设置为 FirebaseStorage 中的子文件夹的名称。

像这样:

所以基本上我在文件夹 Call ListingImages 和 Inside per Listing(Firestore 中的文档)中有一个文件夹,有一个文件夹。

所以我的最终目标是,当我在我的 Firestore 中删除具有该 ID 的文档时,它会删除 Firebase 存储中的文件夹及其所有内容。

目前,我有这个云函数代码,但它不起作用:

// Function que elimina imagenes de un Listing cuando es borrado de Firebase.
exports.listingImagesDelete = functions.firestore.document("listings/{listingId}").onDelete((snapshot, context) => {
  const listingId = snapshot.id;

  const filePath = "ListingImages/" + listingId + "/";
  const defaultBucket = admin.storage().bucket();
  const file = defaultBucket.file(filePath);
  const pr = file.delete();

  return pr;
});

但是当我 运行 它(从 Firestore 中删除列表)时它给我这个错误:

虽然有文件夹,但看起来好像没有对象。

关于如何完成这项任务有什么想法吗?

您可以尝试使用@google-cloud/storage模块并设置路径前缀:

const { Storage } = require("@google-cloud/storage")

exports.listingImagesDelete = functions.firestore.document("listings/{listingId}").onDelete((snapshot, context) => {
  const listingId = snapshot.id;
  
  const storage = new Storage();

  const bucket = storage.bucket('name'); // [PROJECT_ID].appspot.com is default bucket
    
  return bucket.deleteFiles({
    prefix: `ListingImages/${listingId}`
  })
});

文件夹在云存储上不是真实的东西。实际上它只是一长串文件,在文件的 name/path 中有一个 / 被解释为一个文件夹(也称为 前缀 , 因为它是 name/path).

的开始

这实际上意味着要删除文件夹,您需要删除该文件夹中的所有文件。执行此操作后,该文件夹将自动消失。