Ошибка: функция вышла из области действия запроса. Функция прервана. С большим списком - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь выполнить облачную функцию, которая отправляет push-уведомления всем пользователям в списке. Это хорошо работает, когда список маленький. Я думаю, что проблема связана с количеством звонков, которые я делаю, чтобы отправить пуш. Есть идеи?

Облачные функции:

exports.sendPushToUsers = functions.https.onCall((data, response) => {
    var promisesSendPushs = [];
    return admin.database().ref(Constants.USERS).once("value")
    .then((usersSnap) => {
        if(usersSnap.exists()) {
            usersSnap.forEach(userSnap => {
                if(userSnap.exists()) {
                    var user = userSnap.val();
                    if(user.firebaseToken !== undefined) {
                        var promiseSendPush;
                        if(user.platform === Constants.PLATFORM.IOS) {
                            promiseSendPush = pushs.customIOS.customized(user.firebaseToken, user.uid, data.title, data.body);
                        } else {
                            promiseSendPush = pushs.customAndroid.customized(user.firebaseToken, user.uid, data.title, data.body);
                        }
                        promisesSendPushs.push(promiseSendPush);
                    }
                }
            });
            return Promise.all(promisesSendPushs)
        } else {
            console.log("usersSnap undefined");
            return {code: 0, state: 'undefined'};
        }
    })
    .then(() => {
        console.log("promisesSendPushs: " + promisesSendPushs.length)
        return {code: 0, state: 'pushs send!'};
    })
    .catch(err => {
        console.log ('Error getting documents', err);
        return { code: 1, error: err};
    });
})

Custom push lib:

const admin = require('firebase-admin');

function sendPushToUser(firebaseToken, message, uid) {
  if(firebaseToken) {
    return admin.messaging().sendToDevice(
        [ firebaseToken ],
        message
    ).then(() => {
      return { code: 0}
    })
    .catch((err) => {
      return { code: 1}
    });
  } else {
    return { code: 1 }
  }
}

exports.customized = function(firebaseToken, uid, title, body) {
  let message = {
    data: {
      title: `${title}`,
      body: `${body}`
    }
  };
  return sendPushToUser(firebaseToken, message, uid);
};

Ошибка пожарной базы консоли:

Error: function crashed out of request scope

Вызов функции был прерван.

1 Ответ

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

Вы, вероятно, не хотите отправлять результат всех этих обещаний клиенту:

return Promise.all(promisesSendPushs)

Возможны сбои облачных функций при попытке сериализовать все результаты всех разрешенных обещаний, что может привести кlarge.

Вместо этого определите ответ, который вы хотите отправить клиенту, если все обещания будут выполнены. Например:

return Promise.all(promisesSendPushs)
.then(results => {
    return { the object to send to the client on success }
})
.catch(error => {
    return { the object to send to the client on error }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...