我已经开发了几周的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
包中的错误,或其他地方的错误。有什么想法吗?
答案 0 :(得分:1)
GCS认为每次上传都是一个全新的对象。如果对象将名称共享为现有对象,则将删除先前存在的对象,并且新的属性(包括ACL)将与旧对象无关。
您可以通过几种方式解决此问题。最简单的方法是将firebase-storage添加到存储桶的“默认对象ACL”,这将导致所有新创建的对象都具有包含该服务帐户的ACL,除非另有说明。从命令行,如果你安装了gcloud SDK,你可以这样做:
gsutil defacl ch -u firebase-storage@system.gserviceaccount.com:O gs://bucketname
另一种选择是将ACL明确设置为上传的一部分或紧接其后。