firebase 是否有一种方法可以确定云函数是否已经完成运行--通过循环getDownloadURL或消息传递?

slmsl1lt  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(104)

我仍然在掌握Firebase和Cloud的功能,但这是我想弄清楚的。

当前设置

我的应用程序有一个云功能,它会把上传到存储桶的PDF文件转换成PNG格式,不会破坏原始的PDF文件,所以我剩下的两个文件。
然后,新创建的PNG的URL被附加到Firestore中的一个文档的属性中。

我想要完成的

我希望能够上传一个新的PDF作为替换图像。我想我遇到了一个竞争条件,当我试图用新的PNG调用updateDoc()时,cloud函数还没有完成执行。
在客户端,我有从upload方法返回的storageRef

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

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

const storageRef = await functionThatUploadsPDF(file);

updateDocumentInFirestore(storageRef);

updateDocumentInFirestore中,我尝试导航到cloud函数完成后应该存在的新引用,获取下载URL,并更新文档中的该属性:

const newImageRef = ref(storageRef.parent, "generatedImage.png");

const newDownloadURL = getDownloadURL(newImageRef).then((url) => {
     updateDoc(documentRef, backgroundImage: url);
});

但是,我得到了以下错误-我相信是由于云功能尚未完成:
火源储存:对象'paybing.png'不存在。(未找到)

我对潜在解决方案的想法

1.我可以尝试轮询generatedImage.png的存储,直到getDownloadURL调用返回实际的URL,但是我担心这样会产生大量的调用。
1.如果云函数有发送消息通知我转换完成的方法,我可以在收到消息后发送一次下载URL的调用,但我不知道如何实现。

迄今为止的努力

到目前为止,我一直在追求课程1,但还没有取得任何成功。浏览Firebase文档,我还没有找到任何关于如何完成课程1或课程2的支持资源。有人有什么建议吗?无论是关于我计划的行动课程,还是我没有考虑过的新选项?

ljsrvy3e

ljsrvy3e1#

可以使用onFinalize触发器发送消息或更新Firestore中的文档,以指示函数已完成运行。每当创建或更新文件时,都会触发此触发器。
onFinalize在存储桶中成功创建新对象(或现有对象的新一代)时发送。这包括复制或重写现有对象。上载失败不会触发此事件。
你也可以创建一个当downloadURL不为空时解析的承诺,并在updateDocumentInFirestore函数中使用该承诺。2这样,updateDoc函数将仅在downloadURL可用时被调用。
另外,正如评论中提到的,您可以考虑cloud workflow,具体的实现取决于您的特定用例
你也可以查一下这些类似的案例
Firebase Storage: Object does not exist
Error: storage/object-not-found when trying to upload large image file
Firebase Storage Put could not get object

相关问题