首页 > 解决方案 > 如何创建从 Cloud Storage 返回对象列表的 Google Cloud 函数

问题描述

所以我试图返回一个对象数组。我想使用云功能列出谷歌云存储中特定存储桶中的所有对象。以下是我到目前为止所拥有的。它返回和未处理的承诺。

export const getAlbums = functions.https.onCall(() => {
  return new Promise(async (resolve, reject) => {
    //const bucket = admin.storage().bucket('kais-e4ba9.appspot.com')

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

    const storage = new Storage();
    const bucket = storage.bucket("bucketName");

    resolve(bucket)
  }).catch(err => {
    console.log(err.message);
  });
});

我写了一个类似的函数,它从 firebase firestore 返回一组文档。

export const getGenres = functions.https.onCall(() => {
  //if (!context.auth) return {status: 'error', code: 401, message: 'Not signed in'}
  return new Promise((resolve, reject) => {
    const array = [{}];
    const ref = admin.firestore().collection("genres");
    // filter out inaActive genres
    const query = ref.where("isActive", "==", true);
    query.onSnapshot(querySnapshot => {
      // Add genres into an array
      const genres = querySnapshot.docs.map(documentSnapshot => {
        return {
          ...documentSnapshot.data(),
          key: documentSnapshot.id // required for FlatList
        };
      });
      array.push(genres);
      resolve(array);
    });
  });
});

这是您将其记录到控制台时返回的内容。当我调用云函数列出存储桶中的对象时,我想显示相同的结果。

https://firebasestorage.googleapis.com/v0/b/kais-e4ba9.appspot.com/o/Screen%20Shot%202020-01-07%20at%207.22.27%20PM.png?alt=media&token=b777d63d- 3053-4453-86e7-1e2f19f97a51

标签: typescriptfirebaseasync-awaitgoogle-cloud-functionsgoogle-cloud-storage

解决方案


您将需要使用Cloud Storage 列表 API 来列出存储桶中的文件。它与 Firestore 100% 无关。

这是从链接文档中提取的代码:

const [files] = await storage.bucket(bucketName).getFiles();

console.log('Files:');
files.forEach(file => {
  console.log(file.name);
});

将它添加到您的函数中很简单。你从“新承诺”开始的方式并不是最好的方式。我们将使用 async/await 语法以使示例更易于复制:

export const getAlbums = functions.https.onCall(async () => {
    const { Storage } = require("@google-cloud/storage");

    const storage = new Storage();
    const [files] = await storage.bucket(bucketName).getFiles();

    console.log('Files:', files);
    return files.map(file => file.name)
});

如果您只想要项目的默认存储桶,则可以bucketName完全省略该参数。


推荐阅读