Облако с ошибками в базе данных с функцией Promise - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь написать облачную функцию Firebase, которая в настоящее время, по сути, выполняет две вещи:

1) срабатывает всякий раз, когда пользователь подключается / отключается

2) извлекает все разговоры для этот пользователь.

Приведенный ниже код может выполнить Шаг 1, но возвращает функцию, которая вернула неопределенное, ожидаемое обещание или значение Ошибка в консоли.

Я не уверен, как писать обещания, и это моя первая функция Firebase. Пожалуйста, помогите.

    exports.offlineHandler = functions.database.ref('/users/{userid}/status')
      .onUpdate((change, context) => {
        const status = change.after.val();
        const userId = context.params.userid;
        console.log('the user is now ', status, "with mobile no ", userId);
        // fetch a users conversations list
        if (status === "offline") {
          console.log("offline exec start");
          return fetchUserConversations(userId)
            .then(results => {
              console.log("offline exec end");
              for (result in results) {
                console.log("id is", result);
              }
              return results;
            }).catch(err => {
              console.error("An error has occurred.", err);
              return err;
            });
        } else {
          console.log("user came online");
        }
        return null;
      });

function fetchUserConversations(userId) {
  return admin.firestore().collection('users/${userId}/conversations').get()
    .then(snapshot => {
      var conversations = [];
      snapshot.forEach(doc => {
        console.log("This is conversation id => ", doc.id);
        conversations.concat(doc.id);
      });
      return conversations;
      //return conversations;
    }).catch(err => {
      console.error(err);
      return err;
    });
}

1 Ответ

1 голос
/ 27 марта 2020

Синтаксически, вы, похоже, просто пропускаете return до fetchUserConversations(userId).... Итак:

return fetchUserConversations(userId).then(result=>{

Чтобы узнать больше об обещаниях в облачных функциях, лучше всего изучить документацию Firebase по syn c, asyn c и обещаниям , и превосходные видеоматериалы Дуга Стивенсона о с использованием обещаний в Cloud Functions .


Более фундаментальная проблема с вашим кодом состоит в том, что он ничего не делает с разговорами, которые он выбирает для пользователь. Кажется, вы пытаетесь вернуть их из облачной функции, но облачные функции, инициированные записью в базу данных, не могут ничего вернуть. Такие функции запускаются записью в базу данных, , а не пользовательской операцией.

Хотя в вашем случае пользовательская операция (возвращение в оперативный режим) запустила облачную функцию, это косвенный триггер, и вы не можете ничего вернуть пользователю из облачной функции.

У вас есть два основных варианта:

  1. Запишите разговоры где-нибудь в базе данных, чтобы пользователь затем их просматривал.

  2. Изменить облако Тип триггера функций должен быть HTTPS или Callable, а затем вызывать эту облачную функцию из кода приложения, когда пользователь возвращается в онлайн.

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