Облачная функция Google иногда работает, а иногда нет - PullRequest
0 голосов
/ 02 ноября 2019

Я использую функцию onCreate для Firestore, чтобы обнаружить регистрацию пользователя и создать документ, используя его идентификатор пользователя. Проблема в том, что эта функция иногда работает, а другая не работает. Кроме того, я получаю сообщение об ошибке «Функция вернула неопределенное, ожидаемое обещание или значение» все время, когда функция запускается. Я испробовал много решений, которые были даны по аналогичным вопросам, но все же не повезло.

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .then(writeResult => {
      console.log("User Created result:", writeResult);
      return null;
  })
  .catch(err => {
      console.log(err);
      return null;
    });
});

1 Ответ

1 голос
/ 02 ноября 2019

Вам необходимо вернуть обещание, возвращенное асинхронным методом set(), следующим образом:

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  return admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .then(() => {
      console.log("User Created result:", writeResult);
      return null;
  })
  .catch(err => {
      console.log(err);
      return null;
    });
});

Как указано в «Функция вернула неопределенное, ожидаемое обещание или значение»ошибка, вы ДОЛЖНЫ вернуть Promise или значение в фоновой запущенной облачной функции, чтобы указать платформе, что облачная функция завершена. Поскольку вы не возвращаете Обещание, вы сталкиваетесь с этим противоречивым поведением: иногда облачная функция отключается платформой до того, как она записывает в Firestore.

Я бы посоветовал вам посмотреть 3 видео о "Обещаниях JavaScript" изсерия видеороликов Firebase Дуга Стивенсона (https://firebase.google.com/docs/functions/video-series/),, которая объясняет этот ключевой момент.

Также обратите внимание, что метод set() возвращает Promise<void>.

И, наконец,Обратите внимание: если вам не нужен console.log("User Created result:", writeResult);, вы можете сделать следующее:

export const createNewUser = functions.auth.user().onCreate(user => {
  const userId = user.uid;

  const updateData = {
    ads_watched: 0,
    coins: 20000,
    gems: 0
  };

  return admin.firestore().doc("cashon/" + userId)
  .set(updateData)
  .catch(err => {
      console.log(err);
      return null;
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...