【发布时间】: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