如何从 Firebase 云函数中删除 Firebase 存储文件夹?

How to delete a Firebase Storage folder from a Firebase Cloud Function?

我在 Firebase API 参考中找不到 deleteFiles() 方法。我的 IDE 告诉我这个方法有一个可选的 DeleteFilesOptions 参数,我也找不到关于该类型的任何信息。如果有人可以向我指出此文档,我将不胜感激。

就是说,我已经看到许多帖子使用此方法和此参数通过 Cloud Function 删除整个存储文件夹(及其所有文件)。我的问题是,这是正确的方法吗(因为缺少此处的文档)?

const functions = require("firebase-functions");
const admin = require("firebase-admin");

exports.deleteStorageFolder = functions.https.onCall(async (data, _context) => {
    const uid = data.userId;

    try {
        const bucket = admin.storage().bucket(); // returns the default bucket, which is good
        await bucket.deleteFiles({
            prefix: `images/users/${uid}`, // the path of the folder
        });
        return Promise.resolve(true);
    } catch (error) {
        throw new functions.https.HttpsError("unknown", "Failed to delete storage folder.", error);
    }
});

正如@Doug 在评论中提到的那样,“Firebase 只是提供了云存储的包装器。它们是同一回事。”。此外,根据此 documentation,“Cloud Storage for Firebase 将您的文件存储在 Google Cloud Storage 存储桶中,使它们可以通过 Firebase 和 Google Cloud 访问。这使您可以灵活地通过适用于云存储的 Firebase SDK 从移动客户端上传和下载文件。"

话虽如此,我已经尝试使用 deleteFiles() 复制您提供的代码片段,并且在我这边运行良好:

// // The Firebase Admin SDK to access Firestore.
const functions = require("firebase-functions");
const admin = require('firebase-admin');

const firebaseConfig = {
    // Your Firebase configuration...
};

admin.initializeApp(firebaseConfig);

const bucket = admin.storage().bucket();
async function deleteFolder(){
    await bucket.deleteFiles({
    prefix: 'images/users/${uid}'   // the path of the folder
    });
}

deleteFolder();

您可以做的另一个选择是直接使用 Google Cloud Storage,并跳过使用 Firebase Storage:

const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket("your-bucket-name");

bucket.deleteFiles({
  prefix: 'images/users/${uid}'
}, function(err) {
  if (!err) {
    console.log("All files in the `images` directory have been deleted.");    
  }
});

注意一下,按照Doug的建议,您可以先在本地或测试环境中尝试和测试它。更多参考,可以参考delete() and deleteFiles()