请求完成后如何继续运行Firebase云功能

请求完成后如何继续运行Firebase云功能,firebase,google-cloud-functions,Firebase,Google Cloud Functions,Firebase似乎不像典型的Express应用程序那样工作,这真是太奇怪了。无论我在Express中编写什么并将粘贴复制到Firebase函数,我通常都会得到错误。不过,有一个问题我自己无法解决 该端点设计用于启动一个函数,并且能够持续足够长的时间来完成更长的任务。该请求是一个webhook(发送文档,我们将对它们进行转换,并在对指定的另一个webhook执行操作时ping您)。下面是一个非常简单的例子: router.post('/', (req, res) => { try {

Firebase似乎不像典型的Express应用程序那样工作,这真是太奇怪了。无论我在Express中编写什么并将粘贴复制到Firebase函数,我通常都会得到错误。不过,有一个问题我自己无法解决

该端点设计用于启动一个函数,并且能够持续足够长的时间来完成更长的任务。该请求是一个webhook(发送文档,我们将对它们进行转换,并在对指定的另一个webhook执行操作时ping您)。下面是一个非常简单的例子:

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分钟
  • 将长时间执行作业委托给另一个云函数,然后发送响应。要将作业委托给另一个云功能,您应该使用Pub/Sub。有关如何实现该功能的更多详细信息,请参阅和。在发布/订阅触发功能中,当工作完成时,您可以通过电子邮件、电子邮件、Firestore文档更新通知用户,您已在该文档上设置了侦听器,等等。。。如果
    generateZipWithDocuments()
    需要很长时间,那么它显然是用户最友好的选项

  • 如果
    generateZipWithDocuments()
    不是异步的,
    res.sendStatus()
    将在它之后立即执行,并且云功能将终止(
    generateZipWithDocuments()
    完成的作业将不会完成)。有关更多详细信息,请参阅文档

    你有两种可能:

  • 您将其设置为异步,并等待其作业完成后再发送响应。您通常会为此使用
    async/await
    。请注意,云函数的最大执行时间为9分钟
  • 将长时间执行作业委托给另一个云函数,然后发送响应。要将作业委托给另一个云功能,您应该使用Pub/Sub。有关如何实现该功能的更多详细信息,请参阅和。在发布/订阅触发功能中,当工作完成时,您可以通过电子邮件、电子邮件、Firestore文档更新通知用户,您已在该文档上设置了侦听器,等等。。。如果
    generateZipWithDocuments()
    需要很长时间,那么它显然是用户最友好的选项

  • 使用
    async/await
    可能会有点麻烦,因为一些已处理的文档可能需要约2GB(想象一下创建了数千个文档)。在这种情况下,我会遇到超时的风险。另外,我希望它能够连接到第三方API(如Zapier、Pabbly),所以我还需要让用户能够指定我应该向哪个端点发送来自Google云存储的下载链接(最终文件在哪里更新)。多亏了你的链接,我现在才开始关注Pub/Sub。你可以很好地将一些数据从第一个云函数传递到Pub/Sub函数,请参见第三个链接。在任何情况下,如果在云函数中执行作业,必须使用
    async/wait
    (或
    then()
    )才能正确管理云函数的生命周期,请参阅我答案中的第一个链接。非常感谢!我会检查所有这些,等我把它修好再回来。同时:你知道为什么它在本地工作而没有任何子机制吗?我想如果它在生产上不起作用,那么本地环境也不应该起作用,而且那些配额很混乱:-PubSub函数算作后台函数?如果是这样,在用户发送超过10MB的文件的情况下,该功能将无法工作?抱歉问了这么多问题,文档真的不是一件容易的事read@jeand“请看。由于您的新问题与您原来的帖子不同,我建议您针对它创建一个新问题。使用
    async/await
    可能会有点麻烦,因为一些处理过的文档可能需要约2GB(想象一下创建了数千个文档)。在这种情况下,我会遇到超时的风险。另外,我希望它能够连接到第三方API(如Zapier、Pabbly),所以我还需要让用户能够指定我应该向哪个端点发送来自Google云存储的下载链接(最终文件在哪里更新)。多亏了你的链接,我现在才开始关注Pub/Sub。你可以很好地将一些数据从第一个云函数传递到Pub/Sub函数,请参见第三个链接。在任何情况下,如果在云函数中执行作业,必须使用
    async/wait
    (或
    then()
    )才能正确管理云函数的生命周期,请参阅我答案中的第一个链接。非常感谢!我会检查所有这些,等我把它修好再回来。同时:你知道为什么它在本地工作而没有任何子机制吗?我想如果它在生产上不起作用,那么本地环境也不应该起作用,而且那些配额很混乱:-PubSub函数算作后台函数?如果是这样,在用户发送超过10MB的文件的情况下,该功能将无法工作?抱歉问了这么多问题,文档真的不是一件容易的事read@jeand“请看。因为你的新问题与你原来的帖子是分开的,我建议你就它提出一个新问题。