无法使用 Firebase 管理员在 Node.js 的 Google 存储对象上设置元数据

Posted

技术标签:

【中文标题】无法使用 Firebase 管理员在 Node.js 的 Google 存储对象上设置元数据【英文标题】:Cannot set metadata on a Google Storage Object from Node.js using Firebase Admin 【发布时间】:2019-05-28 12:24:22 【问题描述】:

我正在编写一个 Firebase 应用程序,我需要在运行 Node.js 的后端中进行一些更改

admin.initializeApp(
  credential: admin.credential.cert(serviceAccount),
  storageBucket: config.get("firebase.storage")
);

我从初始化 admin 中获得了存储桶,并且能够从该文件中看到现有的元数据。设置它不起作用:

const myfile = URL: "/users/1/demo.png"; //this file exists

const bucket = admin.storage().bucket();
const [metadata] = await bucket.file(redeemable.URL).getMetadata();
console.log(metadata); //this works
if (!metadata.metadata.whitelist) metadata.metadata.whitelist = ;

metadata.metadata.whitelist[req.user.userId] = true;

await bucket.file(myfile.URL).setMetadata(metadata);

firebase 管理员不应该有访问权限吗?我也没有收到任何错误。

【问题讨论】:

这里缺少太多信息。究竟是什么行不通?有错误吗?这里我们看不到的所有变量的值是多少?请尝试对值进行硬编码,以便我们可以看到您打算做什么。 setMetadata 不起作用。存储桶和文件(唯一的变量)是正确的我可以看到并 console.log 文件的元数据但是当我设置它时,它没有。官方文档中也缺少它。没有错误 元数据确实有效。如果没有看到您正在处理的所有确切值,Stack Overflow 无能为力。 ***.com/help/mcve 很遗憾听到权威人士说您确定它有效并且 SO 无能为力。你能告诉我你需要什么确切的值吗?文件字符串?我永远无法制作一个简单的示例,因为它需要我无法发布的谷歌存储服务器的访问代码。没有其他任何东西丢失。但它在他们的 Node.js 官方文档中丢失,并且只提到了从 gsutil 工具设置元数据。我确实添加了更多代码以使其更清晰。 当您说console.log(metadata) 有效时,它究竟做了什么符合您的期望?您传递给 setMetadata 的对象到底是什么样的?让我们将这段代码简化为对 setMetadata 的一次调用,看看它是否收到了您期望的数据。 【参考方案1】:

正如 OP 在 cmets 中发现的那样,metadata 对象必须是 metadata: Record<string, string> 类型。 documentation 没有提到这一点,TypeScript 类型也没有帮助。

编辑:文档 do 实际上提到了它(强调我的):

您可以在给定对象的元数据键中设置自定义键/值对,

但措辞让人很容易错过。

bucket
    .file("path/to/file")
    .setMetadata(
      metadata: 
        someKey: "someValue",
      ,
    )

【讨论】:

以上是关于无法使用 Firebase 管理员在 Node.js 的 Google 存储对象上设置元数据的主要内容,如果未能解决你的问题,请参考以下文章

无法为 Firebase 中的 bigquery 链接启用谷歌分析

无法在多个文件中拆分 Firebase 函数

Firebase 的跨域政策是啥?

无法使用 firebase_messaging 在 iOS 上的 Flutter 应用中订阅主题

我无法弄清楚如何防止在 Node.js 中出现此 CORS 错误 [重复]

基于角色的身份验证 vue js firebase