Gcloud ApiError:即使相同的API将文件写入存储,权限也不足

时间:2015-12-12 02:00:01

标签: node.js gcloud-node

我在这里不知所措。我的节点代码成功将文件上传到gcloud存储,但似乎无法公开文件甚至更改acl。

事实是该文件是用gcloud存储编写的,但不能公开相同的文件。

返回的错误是

  

{[ApiError:权限不足]       错误:        [{domain:' global',            原因:'不足的承诺',            消息:'权限不足' }],       代码:403,       消息:'权限不足',       响应:未定义}

这是我的代码(假设此代码位于STREAM ergo stdout.pipe内)

var gcs = GLOBAL.gcloud.storage();
var bucket = gcs.bucket(GLOBAL.storage_names.products);
var file = bucket.file('images/'+targetValue+'_'+filename);
stdout.pipe(file.createWriteStream())
  .on('error', function(err) {
    var msg = {
      "status":"Error"
      "err":err
    };
    console.log(msg);

  })
  .on('finish', function() {
    // The file upload is complete.
    console.log("Successfully uploaded "+targetValue+'_'+filename);
    file.acl.add({
      entity: 'allUsers',
      role: gcs.acl.READER_ROLE
    }, function(err, aclObject) {

      if(err==null)
      {
        //stream upload file
        file.makePublic();
      }else{
        console.log("ERROR in ACL Adding");
        console.log(err)
      }

    });
    file.makePublic(function(err, apiResponse) {
      if(err==null)
      {
        console.log("File made public");
      }else{
        console.log("make public error");
        console.log(err);
      }
    });
  });

1 个答案:

答案 0 :(得分:4)

虽然代码没有完全显示问题,但这可能会有所帮助:WRITER bucket 权限可以创建对象,但您需要OWNER object 权限才能更改现有的ACL对象。此外,对象的创建者不会自动被授予OWNER 对象权限(即使他们是存储桶的所有者) - 如果您在创建时未指定predefined ACL对象,Google云端存储始终将存储桶的default object ACL应用于新创建的对象。

因此,两个可能的修复方法是(1)提前在存储桶上设置默认的对象 ACL,以将您的应用程序凭据包含为OWNER,或者(2)提供预定义的ACL(例如'publicRead') )在对象创建时,而不是在之后更改它。