【问题标题】:firebase cloud functions onFinalize trigger with not predefined bucket?没有预定义存储桶的firebase云函数onFinalize触发器?
【发布时间】:2020-05-16 00:54:23
【问题描述】:

是否可以编写一个firebase云函数,在firebase存储中创建新的fila时触发 - onFinalize(但我们事先不知道确切的存储桶)?

在我的 firebase 存储中有一个文件夹“loads”,在里面我有一个以 load id 命名的文件夹,例如:

  • /loads/-Lw1UySdunYyFMrrV6tl
  • /loads/-LwisA5hkNl_uxw3k36f
  • /loads/-LwkPUm-q7wNv-wZ49Un

https://ibb.co/NnQkTyC这里是存储截图

我想在这些文件夹之一中创建新文件时触发云功能。我不知道文件将在哪里创建。我不知道这是否可能。这就是我需要建议的原因。

我的主要目标是在云功能中将 2 个 pdf 文件合并为一个。在我的前端应用程序(使用 vuejs 编写的 TMS)中,我使用 html2canvas/jsPDF 创建了confirmationOrder.pdf,然后将其保存到 storage/loads/${loadID}。稍后用户可以在同一个存储桶上手动上传 POD.pdf。当它发生时,我希望我的云功能将这两个 pdf 合并到一个新文件中(在同一个存储桶中)。但是我又一次不知道桶。

这是我在前端上传 PDF 的方法:

 async uploadConfPDF({ commit }, payload) {
      const PDF = payload.PDF;
      const loadID = payload.loadID;
      const fileName = payload.fileName;

      const fileData = await firebase
        .storage()
        .ref(`loads/${loadID}/${fileName}.pdf`)
        .put(PDF);

      const confOrderURL = await fileData.ref.getDownloadURL();

      return confOrderURL;
    }, 

非常感谢任何帮助。对不起,如果我的解释似乎不够清楚。英语不是我的母语。

【问题讨论】:

  • 您能否展示一张您的云存储控制台的图片。如果你有一些现有的代码,你也可以分享一下吗?你确定你使用了几个buckets。你不是指不同的References吗?
  • 请编辑问题以显示所有相关代码,以便我们看到您在做什么,包括您目前拥有的客户端和服务器代码。您应该准确解释该代码的工作方式与您期望的不同。

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


【解决方案1】:

根据您的问题进行编辑

根据您的代码和 Cloud Storage 控制台的打印屏幕,您正在项目的默认存储桶中工作,该位置的 URL 为 gs://alex-logistics.appspot.com

正如我们在您的 Cloud Storage 控制台的打印屏幕上看到的,您存储桶中的文件以分层结构的形式呈现,就像您本地硬盘上的文件系统一样。然而,这只是一种呈现文件的方式:存储桶中没有真正的文件夹/目录,Cloud Storage 控制台只是使用文件路径的不同部分来“模拟”文件夹结构。


因此,基于以上段落,我认为您的问题可以重新表述为“在云函数中,如何提取上传到默认文件的路径的不同部分我的 Firebase 项目的存储桶?”。

答案:

在将文件添加到默认存储桶时触发的Cloud Function中,您可以通过以下方式获取文件路径:

exports.yourCloudFunction = functions.storage.object().onFinalize(async (object) => {

    const filePath = object.name; // File path in the bucket.

    //...

});

由于我们使用onFinalize 事件处理程序,因此您可以通过使用object 对象的name 属性获取这个新文件的路径,该对象的类型为ObjectMetadata

然后,您可以使用一些String 方法,例如,从此路径中提取您在问题中引用的${loadID}

【讨论】:

  • 我已经编辑了我的问题,以便更清楚地理解。我事先不知道桶。这就是问题所在。
  • @nickstojanovic 您确定您使用的是不同的存储桶吗?从你的新版本看来,你有不同的路径,但在同一个桶中。您能否使用 Cloud Storage 控制台的屏幕截图 + 用于上传 PDF 的代码来编辑您的问题
  • 另外,请注意,没有用于移动和网络客户端的 Firebase 客户端库可以创建新的 Cloud Storage 存储桶(包括 Vue.js 中使用的 JS SDK)。这是一项特权操作,仅保留给在特权环境中运行的 CLI 和服务器 SDK。
  • 我不擅长术语。桶是一样的。但路径不同。
  • 谢谢!接受你的回答!你真的帮了我!
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2019-04-10
  • 1970-01-01
  • 2018-12-24
  • 2020-03-08
  • 1970-01-01
  • 2020-05-17
  • 2018-09-14
相关资源
最近更新 更多