请求完成后如何继续运行Firebase Cloud Function

li9yvcax  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(163)

真奇怪,Firebase似乎并不像典型的Express应用程序那样工作。无论我在Express中编写什么并复制粘贴到Firebase Functions,我通常都会收到错误。有一个我自己无法弄清楚。
这个端点被设计为启动一个函数,并且存活足够长的时间来完成更长的任务。这个请求是一个webhook(发送文档,我们将转换它们,并在完成后ping你指定另一个webhook)。下面是非常简化的示例:

router.post('/', (req, res) => {
  try {
    generateZipWithDocuments(data) // on purpose it's not async so request can return freely
    res.sendStatus(201)
  
  } catch (error) {
    res.send({ error })
  }
})

在我的本地机器上,它可以工作(纯Express应用程序和本地模拟的Firebase函数),但在云中,它有问题,即使我放了一个console.log()的行列,我也没有得到太多的信息。Firebase没有错误。

u1ehiz5o

u1ehiz5o1#

如果generateZipWithDocuments()不是异步的,res.sendStatus()会在res.sendStatus()之后立即执行,云函数会被终止generateZipWithDocuments()的工作不会完成),详见here文档。
您有两种可能性:
1.您可以使其异步,并在发送响应之前等待其作业完成。您通常会使用async/await。请注意,Cloud Function的最大执行时间为9分钟。
1.将长时间执行的作业委托给另一个云函数,然后然后发送响应。要将作业委托给另一个云函数,应使用发布/订阅。有关如何实现的详细信息,请参阅Pub/Sub triggersthe sample quickstartthis SO thread。在发布/订阅触发函数中,当作业完成时,您可以通过电子邮件通知用户,一个notification,一个Firestore文档的更新,你已经设置了一个监听器,等等……如果generateZipWithDocuments()需要很长时间,它显然是最用户友好的选择。

相关问题