【问题标题】:Read from firebase storage and write to firestore using firebase functions使用 firebase 函数从 firebase 存储读取并写入 firestore
【发布时间】:2021-09-12 15:18:48
【问题描述】:

我试过这个打字稿代码????

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

import serviceAccount from "/Users/300041370/Downloads/serviceKey.json";

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

const buckObj = functions.storage.bucket("myBucket").object();
export const onWikiWrite = buckObj.onFinalize(async (object) => {
  const filePath = object.name ?? "test.json";
  const bucket = admin.storage().bucket("myBucket");

  bucket.file(filePath).download().then((data) => {
    const contents = data[0];
  data = {"key": "value"};
const doc = admin.firestore().collection("myCollection").doc();
doc.set(data);
  });
});

但这给了我以下错误

"status":{"code":7,"message":"权限不足,无法(重新)配置触发器(存储桶 myBucket 的权限被拒绝)。请授予存储桶编辑者角色的所有者权限并尝试再次。

我曾问过这个question here,但它作为this question 的副本被关闭了。它基本上说,storage.bucket("myBucket") 功能不受支持,我将不得不改用match 来将此操作限制在此特定存储桶/文件夹中的文件。因此,我尝试了这个????

const buckObj = functions.storage.object();
export const onWikiWrite = buckObj.onFinalize(async (object) => {
  if (object.name.match(/myBucket\//)) {
    const fileBucket = object.bucket;
    const filePath = object.name;
    const bucket = admin.storage().bucket(fileBucket);
    bucket.file(filePath).download().then((data) => {
      const contents = data[0];
      const doc = admin.firestore().collection("myCollection").doc();
      const data = {content: contents}
      doc.set(data);
    });
  }
});

我仍然面临同样的问题。我会在这里重复一遍:

"status":{"code":7,"message":"权限不足,无法(重新)配置触发器(存储桶 myBucket 的权限被拒绝)。请授予存储桶编辑者角色的所有者权限并尝试再次。

【问题讨论】:

  • 通常情况下,由于 Firebase SDK for Cloud Functions 的 1.0 版 firebase-admin 应初始化为 without any parameters within the Cloud Functions runtime
  • 最亲爱的@RenaudTarnec,我什至无法想象,这就是问题所在。基本上,在由于其他问题而发生这种情况之前,我将此参数添加到管理员调用中。然后较早的问题得到解决,这个管理参数可能已经开始给出同样的问题。无论如何,谢谢????
  • 很高兴我能帮助你@kamalbanga。请参阅我的回复,其中指出了 Cloud Functions 生命周期管理的一个重要方面:当所有异步处理完成时,您需要返回一个 JavaScript 承诺。
  • 是的,看着它。

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


【解决方案1】:

自适用于 Cloud Functions 的 Firebase SDK 1.0 版以来,firebase-admin 在 Cloud Functions 运行时中应为 initialized without any parameters

以下应该可以工作(我已经删除了对filePath的检查):

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

export const onWikiWrite = functions.storage
  .object()
  .onFinalize(async (object) => {
    const fileBucket = object.bucket;
    const filePath = object.name;
    const bucket = admin.storage().bucket(fileBucket);
    return bucket
      .file(filePath)
      .download()
      .then((data) => {
        const contents = data[0];
        return admin
          .firestore()
          .collection('myCollection')
          .add({ content: contents });
      });
  });

请注意,我们返回异步 Firebase 方法返回的 chain of promises。在执行异步处理的云函数(也称为“后台函数”)中,关键是在所有异步处理完成后返回 JavaScript 承诺。

我们也使用add() 方法代替doc().set()


最后,在检查filePath的值时,请注意云存储中实际上没有文件夹或子目录的概念(参见answer)。

【讨论】:

  • 顺便说一句,我在存储桶myBucket 中匹配文件的方式正确吗?
  • 不确定。看我上次的更新。混淆存储桶名称和“文件夹”名称是一个经典错误。我建议您使用console.log(filePath) 来真正找到正确的值。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2020-02-11
  • 2021-05-14
  • 2019-12-20
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多