javascript - 云函数未在实时数据库上执行 ref.once

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

今天早上我的云功能运行良好。但现在它突然停止工作了。所以我添加了更多日志,我注意到 rootRef.once 没有执行。为什么会发生这种情况?该函数不断超时。

exports.assignTeams = functions.https.onCall((data, context) => {
  const judgeId = data.judgeId;
  console.log("Assigning teams to judge ", judgeId);
  var db = admin.database();
  var rootRef = db.ref("/");
  rootRef.once(
    "value",
    function(snapshot) {
      console.log("Passed value ", snapshot);
      processAssignedQueue(snapshot, judgeId);
    },
    function(error) {
      console.log("ERROR:\n" + error);
      return { teams: [] };
    }
  );
});

来自 Firebase 的控制台日志:

firebase console

最佳答案

问题是您没有从函数中返回一个 promise ,该 promise 将解析发送给调用者的数据。现在,您的函数实际上没有返回任何内容,因为 once() 是异步的,并且在查询完成之前立即返回。当可调用函数在没有 Promise 的情况下返回时,它会立即关闭,任何异步工作都将无法完成。

此外,您应该注意,传递给 Once() 的回调中的 return 语句只是这些单独函数回调的返回值,而不是整个函数的返回值。

您应该做的是利用 once() 返回的 promise ,并使用它来确定返回给客户端的内容。这是一个简单的例子:

return rootRef.once("value")
.then(snapshot => {
    console.log("Passed value ", snapshot);
    return { data: snapshot.val() }
})
.catch(error => {
  console.log("ERROR:\n" + error);
  return { teams: [] };
});

为了有效地编写云函数,您需要完全了解 JavaScript Promise 的工作原理。如果您没有正确使用它们,您的功能将以神秘的方式失败。

关于javascript - 云函数未在实时数据库上执行 ref.once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60956349/

相关文章:

JavaScript - 如何处理 fetch 中的 404 错误?

javascript - 将值解析为 javascript 函数

javascript - 一个简单的写入数据库的云函数

swift - 数据未显示在 Firebase 的 TableView 中

javascript - 如何创建从 Firebase 读取数据然后在 twilio 上发送消息的计划函数

javascript - Jquery 组件应该返回 false

javascript - 在javascript中平均2个十六进制颜色

java - 安卓 :how to display all users in firebase database except one

javascript - Firebase 上传功能每次的工作方式都不同

python-3.x - 如何从 "Google Cloud BigQuery"连接到 "Google Cloud functions"公共(public)数据集