0

几周以来,我一直在开发 Express/Firebase 应用程序。一切正常,直到我遇到以下问题:

TypeError: firebase.storage is not a function

快速搜索让我找到了TypeError: firebase.storage is not a function。因此,使用那里收集的解决方案,我成功配置@google-cloud/storage了。但后来,我遇到了:

Caller does not have storage.objects.create access to bucket example.appspot.com

经过一番谷歌搜索后,我了解到我必须手动将我的 firebase-admin 用户添加到https://console.cloud.google.com/storage/example.appspot.com上的存储桶中

在此处输入图像描述

完成后,我测试以下内容:

bucket.upload('./package.json')
  .then((file) => {
    console.log(file)
  })
  .catch((error) => {
    console.log(error)
  })

这完美地工作。当我停止 Express 应用程序并重新运行它以尝试再次上传时出现问题,这再次导致Caller does not have...错误。检查存储桶权限,我看到我之前添加的用户现在已经消失了:

在此处输入图像描述

我不知道我是否在这里遗漏了某些东西、@google-cloud/storage包中的错误或其他地方的错误。有任何想法吗?

4

1 回答 1

1

GCS 认为每次上传都是一个全新的对象。如果对象与现有对象共享名称,则先前存在的对象将被删除,并且新的属性(包括 ACL)将与旧的对象无关。

您可以通过几种方式解决此问题。最简单的方法是将 firebase-storage 添加到存储桶的“默认对象 ACL”,这将导致所有新创建的对象都具有包含该服务帐户的 ACL,除非另有说明。在命令行中,如果您安装了 gcloud SDK,您可以这样做:

gsutil defacl ch -u firebase-storage@system.gserviceaccount.com:O gs://bucketname

另一种选择是将 ACL 显式设置为上传的一部分或之后立即。

于 2017-04-18T03:16:35.477 回答