我仍然在掌握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的支持资源。有人有什么建议吗?无论是关于我计划的行动课程,还是我没有考虑过的新选项?
1条答案
按热度按时间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