【问题标题】:How to Properly Terminate an HTTP Cloud Function如何正确终止 HTTP 云函数
【发布时间】:2021-12-31 09:15:57
【问题描述】:

我最近开始使用 Firebase Cloud Functions,但对于如何适当地终止此 HTTP 函数有点困惑:

exports.UpdateUserInfo= functions.https.onRequest( async (request, response) => {
    
    try{
      //Make a read call to Realtime DB
      const snapshot = await admin.database().ref('/UserData').get()
      if (snapshot.exists() == false) {
        response.send("No users found")
        return null 
      }
      //All of the remaining code within the scope of the try block executes
     functions.logger.log("Wait, this function should have ended")
     let updateUserInfo = await userInfoUpdater(response)
    }
     catch{
      functions.logger.info(error);
      response.status(500).send("ERROR")
    }

})

根据我的阅读,终止 HTTP 函数的正确方法是通过响应对象发送响应。但是,似乎除非我包含对 return null 的最终调用,否则该函数将继续执行超出其预期寿命。更糟糕的是,该函数终止并且仍然允许执行额外的网络调用,这使得事情变得非常不可预测和无组织(see logs)。一旦满足条件,我想阻止该功能继续。返回 null 是确保正确终止的最佳方式,还是我遗漏了什么?

【问题讨论】:

  • 看看你的代码。它不会编译。 “在此处输入图像描述”。也许您想编辑问题并更正它。此外,如果您有要显示的日志,请将它们的文本复制到问题中,以便于阅读和搜索。不显示文字图片。
  • “但是,除非我包含返回 null 的最终调用,否则函数将继续执行超出其预期寿命。”这确实是预期的行为。您需要返回一个值来指示该函数已完成,即使它的return null,在let updateUserInfo = await userInfoUpdater(response) 之后丢失。
  • @FrankvanPuffelen,您是否建议在我的云功能完成后始终返回一个值,即使它确实到达了功能块的末尾?
  • 来自terminating functions 上的文档:“使用return; 语句终止同步函数。”

标签: javascript firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

调用response.send() 不会立即终止函数。它只是向 Cloud Functions 发出信号,表明该函数应该在当前代码块返回后关闭,无论是通过 return 语句还是从函数块的末尾脱落。如果函数没有以这两种方式之一返回,则 Cloud Functions 将超时或出现其他问题,因为在发送响应后不久 CPU 就会被钳制。

本质上,发送响应应该是函数在返回之前所做的最后一件事。其他任何事情都容易出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2020-10-09
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多