使用云功能上传到云存储时出错

时间:2018-04-23 12:44:39

标签: javascript google-cloud-platform google-cloud-storage google-cloud-functions

我正在尝试使用由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);
    });
}

由于

1 个答案:

答案 0 :(得分:1)

在我的函数末尾添加return语句后,在存储对象上执行文件删除后,我遇到了同样的错误。这就是我在做的事情:

  1. 进行数据库调用以获取一些数据
  2. 一旦该请求返回,请从云存储(GCS)中删除一些文件
  3. 代码在结构上看起来像这样:

    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/

    从您发布的代码段中我看不到任何会导致我遇到同样问题的内容,但可能会考虑任何可能导致此行为的基于时间的事件。这可以解释您躲避的不一致行为。

    希望这是一种帮助。