我正在尝试使用由HTTP触发的云功能将文件上传到Google云存储。但是,当云功能发送要上传的文件时,我经常(尽管不总是)得到以下错误
错误上传到存储:{ApiError:匿名调用者没有对bucket_name / folder / test.jpg的storage.objects.create访问权限。
我不确定为什么会出现这种错误 - 为什么只有部分时间
以下是代码:
const storage = require('@google-cloud/storage')();
function uploadToStorage(filepath, folder, filename) {
const options = {
destination: bucket.file(`${folder}/${filename}`),
public: false,
resumable: false
};
storage
.bucket(BUCKET_NAME)
.upload(filepath, options)
.then(function () {
console.log(`${filename} uploaded to ${BUCKET_NAME}`);
})
.catch((err) => {
console.error('ERROR uploading to storage: ', err);
});
}
由于
答案 0 :(得分:1)
在我的函数末尾添加return
语句后,在存储对象上执行文件删除后,我遇到了同样的错误。这就是我在做的事情:
代码在结构上看起来像这样:
deleteStuffOutStorage() {
admin.firestore().doc(`My-doc-ref`).get()
.then(snapshot => {
// Do the deleting here {Interacting with GCS}
return deleteFile(snapshot.data().path); // Deletes file
})
.then(success => {
// Worked
})
.catch(error => {
// Error = ApiError: Anonymous caller does not have storage.objects...
})
return; // This statement was creating the problems
}
当我删除return
语句时,我不再收到错误。我认为在我的情况下,它可能与 firebase-admin 对象实例在异步操作(上面的步骤1和2 )之间取消分配和重新分配有关,或者在至少它的GCS身份验证令牌?
所有FCF实例都应该可以通过自动生成的服务帐户访问GCS。您可以在GCP控制台中确认:https://console.cloud.google.com/iam-admin/serviceaccounts/
从您发布的代码段中我看不到任何会导致我遇到同样问题的内容,但可能会考虑任何可能导致此行为的基于时间的事件。这可以解释您躲避的不一致行为。
希望这是一种帮助。