访问Firebase存储中的文件会导致403(“要计费的项目与缺少的计费帐户相关联”)

时间:2019-05-06 03:04:33

标签: node.js google-cloud-functions firebase-storage

我正在开发Firebase Cloud Function,该功能从Firebase的存储中存储的文件中收集元数据

我的代码几乎是这样:

const { Storage } = require('@google-cloud/storage');
const storage = new Storage();

exports.someFunction = functions.https.onCall((data, context) => {
    getMetadata("myBucket", data.filename)
        .then(() => {
            console.log("OK");
            return;
        })
        .catch(err => {
            console.error(err);
        })

    // do some other stuff here ....

    return;
}

async function getMetadata(bucketName, filename) {
    const [metadata] = await storage
        .bucket(bucketName)
        .file(filename)
        .getMetadata();  <<== ERROR HAPPENS IN THIS CALL

    console.log(metadata.selfLink);
    console.log(metadata.size);
}

每当调用storage.bucket(bucketName).file(filename).getMetadata()时,如上面的代码所示,结果为403,其中“要计费的项目与缺少的计费帐户相关联”。我尝试过在本地(使用firebase functions:shell)和部署它。这是完整的错误消息:

{ Error: The project to be billed is associated with an absent billing account.
    at Util.parseHttpRespBody (/srv/node_modules/@google-cloud/common/build/src/util.js:191:38)
    at Util.handleResp (/srv/node_modules/@google-cloud/common/build/src/util.js:135:117)
    at retryRequest (/srv/node_modules/@google-cloud/common/build/src/util.js:423:22)
    at onResponse (/srv/node_modules/retry-request/index.js:200:7)
    at /srv/node_modules/teeny-request/build/src/index.js:222:13
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)
  code: 403,
  errors: 
   [ { domain: 'global',
       reason: 'accountDisabled',
       message: 'The project to be billed is associated with an absent billing account.',
       locationType: 'header',
       location: 'Authorization' } ],
  response: undefined,
  message: 'The project to be billed is associated with an absent billing account.' }

该Firebase项目已被列入“ Blaze计划”已有数周之久,并且计费帐户已启用了大约一年,其他GCP项目也需要付费。

我已阅读该服务帐户,该帐户应具有“ signBlob”权限,我尝试通过将“服务帐户令牌创建者”添加到默认AppEngine服务帐户和Firebsae服务帐户中来进行尝试。

我还尝试通过Firebase的管理SDK初始化存储

const serviceAccount = require("path-to-json-downloaded-from-firebase-console.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://<my-project>.firebaseio.com"
});
const storage = admin.storage();

但两者都没有运气。

我无法弄清楚哪个帐户被“禁用”或“缺席”,也无法确定该如何运行并陷入困境。

任何可以使我进一步解决问题的指针都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

原因是我对代码调用中的“存储桶”和“文件名”有误解。

在我的情况下,将bucketName输入为MyClassModel.find({}).exec() ,将fileName输入存储桶下的完整路径即可解决此问题。

更明确地说,参数应该像这样:

gs://[my-project].appspot.com