Облачная функция не выполняет ref.once в реальном времени БД - PullRequest
0 голосов
/ 31 марта 2020

Этим утром моя облачная функция работала нормально. Но теперь он вдруг перестал работать. Поэтому я добавил еще несколько журналов и заметил, что 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:

пожарная консоль

1 Ответ

2 голосов
/ 31 марта 2020

Проблема в том, что вы не возвращаете обещание от функции, которая разрешает данные для отправки вызывающей стороне. Прямо сейчас ваша функция фактически ничего не возвращает, потому что once() является асинхронным и возвращается непосредственно перед завершением запроса. Когда вызываемая функция возвращается без обещания, она немедленно закрывается, любая асинхронная работа не будет завершена.

Кроме того, вы должны заметить, что операторы 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: [] };
});

Для эффективного написания облачных функций вам необходимо полностью понять, как работают javascript обещания. Если вы не будете правильно с ними работать, ваши функции не будут работать таинственным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...