云功能未在实时数据库上执行ref.once

时间:2020-03-31 17:22:25

标签: 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

1 个答案:

答案 0 :(得分:2)

问题是您没有从函数解析返回要发送给调用者的数据的承诺。现在,您的函数实际上什么也不返回,因为once()是异步的,并且在查询完成之前立即返回。当可调用函数没有承诺返回时,它将立即关闭,任何异步工作都不会完成。

此外,您还应该注意,传递给after()的回调内部的return语句仅是来自各个函数回调的返回值,而不是整个函数的返回值。

您应该做的是利用once()返回的承诺,并使用该承诺确定退还给客户的内容。这是一个简单的示例:

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

为了有效地编写Cloud Functions,您需要完全了解javascript的工作原理。如果您不能正确使用它们,您的功能将以神秘的方式失败。