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