真的很奇怪,Firebase似乎不像典型的Express应用程序那样工作。无论我在Express中写什么,复制粘贴到Firebase函数中,我通常都会得到错误。但有一个我自己无法理解。
这个端点被设计用来启动一个函数并存活足够长的时间来完成更长的任务。这个请求是一个webhook(发送文档,我们将转换文档并在完成后通知你指定另一个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没有错误。
如果generateZipWithDocuments()
不是异步的,res.sendStatus()
将紧随其后立即执行,云功能将被终止(generateZipWithDocuments()
完成的工作将无法完成)。更多详细信息,请参阅此处的文档。
你有两种可能:
- 您将其设置为异步,并在发送响应之前等待其任务完成。您通常会使用
async/await
。请注意,云函数的最大执行时间为9分钟。 - 将长时间执行的任务委托给另一个云函数,然后,则发送响应。要将任务委托给另一个Cloud Function,您应该使用Pub/Sub。有关如何实现它的更多细节,请参阅Pub/Sub触发器、样例快速入门和这个SO线程。在Pub/Sub触发函数中,当任务完成时,您可以通过电子邮件、通知、已设置监听器的Firestore文档的更新等方式通知用户。如果
generateZipWithDocuments()
需要很长时间,它显然是最用户友好的选项。