【问题标题】:Firebase Storage Admin Error:400 Invalid Bucket NameFirebase 存储管理员错误:400 无效的存储桶名称
【发布时间】:2019-04-27 16:34:13
【问题描述】:

我正在尝试使用 firebase 功能来维护我的数据库和存储。基本上在过期后将一些旧条目从一个 ref/bucket 删除到另一个。 数据库部分工作得很好。但是,存储部分,并没有那么多。以下是我在代码中初始化所有内容的方式:

var functions = require('firebase-functions');
var admin = require("firebase-admin");
var serviceAccount = require('./my-app-bla-bla.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://my-app.firebaseio.com',
  storageBucket: 'gs://my-app.appspot.com'
});

然后在清理数据库和存储的 cron 作业中,我有以下内容(这只是一些小的相关部分):

const st = admin.storage();

st.bucket("gs://my-app.appspot.com/old-listings/"+listingKey).create(function(error, bucket, apiResponse) {
    if (error) {
        console.log("Couldn't create an OldListing bucket: " + error.code);
        console.log(apiResponse);
    } else {
        console.log("Created OldListing bucket");
    }
});

最后一段代码触发了错误并给了我以下日志:

Couldn't create an OldListing bucket: 400
{ error: 
   { errors: [ [Object] ],
     code: 400,
     message: 'Invalid bucket name: \'my-app.appspot.com/old-listings/SomeUniqueID\'' } }

因为我是第一次运行这段代码,所以文件夹old-listings 还不存在。所以我想也许我应该先自己创建它的存储桶。它给了我同样的错误。

我也尝试使用没有 gs 链接的存储桶,例如st.bucket("old-listings/"+listingKey) 而不是 st.bucket("gs://my-app.appspot.com/old-listings/"+listingKey)。仍然给我同样的错误。

那么这里到底缺少什么?我做错了什么?

编辑 1

我尝试在 cron 函数的开头添加以下代码 sn-p。为了更好地了解正在发生的事情。

admin.storage().bucket("my-app.appspot.com").exists(function(error, exists) {
    if (!error) {
        if (exists) {
            console.log("Top Bucket Exists");
        } else {
            console.log("Top Bucket Does Not Exist");
        }
    } else {
        console.log("Top Bucket Error " + error.code);
    }
});

admin.storage().bucket("my-app.appspot.com/listings").exists(function(error, exists) {
    if (!error) {
        if (exists) {
            console.log("Listings Bucket Exists");
        } else {
            console.log("Listings Bucket Does Not Exist");
        }
    } else {
        console.log("Listings Bucket Error " + error.code);
    }
});

我在日志中得到以下信息:

Top Bucket Exists
Listing Bucket Error undefined

当然,我的 Firebase 存储中已经有一个名为 listings 的文件夹。那么到底为什么第二个桶是未定义的呢?

【问题讨论】:

    标签: firebase google-cloud-functions firebase-storage firebase-admin


    【解决方案1】:

    当您为存储桶创建名称时,它不应包含文件路径组件,它应该只是存储桶的唯一名称 - 您所有对象的容器。如果要引用bucket中的文件,可以在bucket对象上使用file()方法得到一个File对象来处理。

    const st = admin.storage();
    const bucket = st.bucket('name-of-your-bucket');
    const file = bucket.file('name-of-your-file');
    

    【讨论】:

    • 所以我认为存储桶与目录相同的理解是错误的。这是整个事情的一个桶。这意味着文件必须通过其在存储桶中的完整路径来标识,例如“listings/name.png”。我的理解正确吗?
    • 但是如果我想处理存储中的目录而不是文件呢?
    • 云存储中实际上没有任何“目录”。只有名称看起来像是包含目录的文件,以帮助您建立文件组织的心理模型。请注意,缺少用于在“目录”中列出文件的 API,因为目录不存在。将来可能会列出“目录”中的文件,但实际上仍然不会有任何目录,只有在“目录”概念中的文件的新索引。
    • 明白,这需要对我的代码进行一些更改。非常感谢。
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2020-07-16
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2018-10-25
    • 2018-09-07
    相关资源
    最近更新 更多