Как решить проблему Firebase Time Out для больших пользовательских токенов? - PullRequest
0 голосов
/ 01 мая 2020

Ошибка при получении:

Ошибка при выполнении запроса: превышено время ожидания 10000 мс

для пользователей более 10000.

Трассировка стека:

Error: Error while making request: timeout of 10000ms exceeded.
    at FirebaseAppError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseAppError.PrefixedFirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseAppError (/srv/node_modules/firebase-admin/lib/utils/error.js:122:28)
    at /srv/node_modules/firebase-admin/lib/utils/api-request.js:123:23
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)
  errorInfo: 
   { code: 'app/network-timeout',
     message: 'Error while making request: timeout of 10000ms exceeded.' },
  codePrefix: 'app' }

Вот код для реализованных облачных функций:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp({
    credential: admin.credential.applicationDefault(),
    databaseURL: 'https://project-123.firebaseio.com/'
});

exports.sendPushNotificationToAllDevices = functions.https.onRequest((request, response) => {
    const domain = request.body.Domain;
    if (typeof domain == "undefined" || domain == null || domain == "") {
        response.status(400).send("Domain is empty.");
        return;
    }
    const url = domain + '/Users';
    admin.database().ref(url).once('value')
        .then(snapshot => {
            let tokens = [];
            let counter = 0;
            const count = snapshot.numChildren();

            snapshot.forEach(function (data) {
                counter++;
                const token = data.val().FirebaseToken;
                if (typeof token !== "undefined" && token !== null && token != "") {
                    tokens.push(token);
                }
                if (counter == count && tokens.length > 0) {
                    const payload = getNotificationPayload(request);
                    console.log(tokens.length);
                    const tokensChunk = chunk(tokens,999);

                    tokensChunk.forEach(function(tokens){
                        sendPushNotificationTo(tokens, payload);
                    });
                }
            });
        });
    response.status(200).send("sending");
});

function getNotificationPayload(request) {
    const notificationTitle = request.body.Title;
    const notificationBody = request.body.Body;
    return {
        notification: {
            title: notificationTitle,
            body: notificationBody,
            sound: 'default'
        }
    };
}

function sendPushNotificationTo(registrationToken, payload) {
      admin.messaging().sendToDevice(registrationToken, payload)
        .then(function (response) {
            console.log("push notification message sent");
        })
        .catch(function (error) {
            console.log("error in sending message");
            console.log(error);
        });
}

function chunk(array, size) {
  if (!array) return [];
  const firstChunk = array.slice(0, size);
  if (!firstChunk.length) {
    return array; 
  }
  return [firstChunk].concat(chunk(array.slice(size, array.length), size)); 
}

// получаем эту ошибку для токенов> 10000 enter image description here

  1. Ошибка: ошибка при выполнении запроса: превышено время ожидания 10000 мс. в FirebaseAppError.FirebaseError [как конструктор] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28) в FirebaseAppError.PrefixedFirebaseError [как конструктор] (/ srv / node_mo_ lib / utils / error. js: 88: 28) в новом FirebaseAppError (/srv/node_modules/firebase-admin/lib/utils/error.js:122:28) в / srv / node_modules / firebase-admin /lib/utils/api-request.js:123:23 at at process._tickDomainCallback (internal / process / next_tick. js: 229: 7) errorInfo: {code: 'app / network-timeout', сообщение : «Ошибка при выполнении запроса: превышено время ожидания 10000 мс.» }, codePrefix: 'app'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...