是否有一种方法来确定一旦一个云功能已经完成运行-无论是通过循环getDownloadURL或消息传递?



我仍然在获得Firebase和Cloud功能的窍门,但这是我想弄清楚的。

当前设置

我的应用程序有一个云功能,可以将上传到存储桶中的PDF转换为PNG。它不会破坏原来的PDF,所以我留下了两个文件。

新创建的PNG的URL随后被附加到我们在Firestore中的一个文档的属性上。

我想完成什么

我希望能够上传一个新的PDF用作替换图像。我想我遇到了一个竞争条件,当我试图用新的PNG调用updateDoc()时,云函数还没有完成执行。

在客户端,我从上传方法返回storageRef:

uploadFunction(...).then((snapshot) => {
return snapshot.ref
}

我将这个函数的结果保存到一个变量中,我试图将其传递到更新方法中,该方法将调整我在Firestore中的文档的属性:

const storageRef = await functionThatUploadsPDF(file);
updateDocumentInFirestore(storageRef);

updateDocumentInFirestore,我试图导航到新的参考,应该存在一旦云功能已经完成,获得下载URL,并更新我的文档属性:

const newImageRef = ref(storageRef.parent, "generatedImage.png");
const newDownloadURL = getDownloadURL(newImageRef).then((url) => {
updateDoc(documentRef, backgroundImage: url);
});

然而,我得到以下错误-我相信由于云功能尚未完成:

Firebase Storage: Object ' Storage -bucket/generatedImage.png'不存在。(存储/object-not-found)

我对潜在解决方案的想法

  1. 我可以尝试轮询存储是否存在generatedImage.png,直到getDownloadURL调用返回实际的URL,但我担心这会产生的调用数量。

  2. 如果云功能有办法发送消息让我知道转换完成,我可以在收到该消息后发送一次下载URL的呼叫。然而,我不知道如何做到这一点。

我一直在学习课程1。到目前为止,还没有取得任何成功。通过浏览Firebase文档,我没有找到任何关于如何实现第1或第2点的支持资源。有没有人对我的行动计划或我没有考虑过的新选择有什么建议?

您可以使用这个onFinalize触发器来发送消息或更新Firestore中的文档,以表明该函数已经完成运行。每当创建或更新文件时,都会触发此触发器。

onFinalize当一个新对象(或一个已存在的对象的新一代)被发送对象)在桶中创建成功。这包括复制或者重写一个现有的对象。上传失败不会触发此操作事件。

你也可以创建一个承诺,当downloadURL不为空时,它会解析,并在你的updateDocumentInFirestore函数中使用这个承诺。这样,updateDoc函数只会在downloadURL可用时被调用。

此外,正如评论中提到的,您可以考虑云工作流。确切的实现将取决于您的具体用例

你也可以检查这些类似的情况

Firebase Storage: Object不存在

错误:试图上传大图像文件时没有找到存储/对象

Firebase Storage Put无法获取对象

相关内容

最新更新