Google 云存储在成功上传后删除 entity/user

Google Cloud Storage removes entity/user after successful upload

我已经开发 Express/Firebase 应用程序几个星期了。一切正常,直到我 运行 遇到以下问题:

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 包中的错误,还是其他地方的错误。有什么想法吗?

GCS 将每次上传视为一个全新的对象。如果该对象与现有对象共享名称,则先前存在的对象将被删除,新的属性,包括ACL,将与旧的没有关系。

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

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

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