Функции Firebase: почему они иногда терпят неудачу? Почему они часто завершаются без ошибок, но не выполняют все задачи? - PullRequest
0 голосов
/ 03 мая 2020

Это сбивает с толку меня. Я шесть месяцев в проекте Firebase и использую Javascript для FireBase-функций. Я многому научился, добавляя транзакции, обещания, пакетные записи и хитрые уловки. Тем не менее, похоже на то, что функция работает правильно. Чаще всего функции выполняются правильно, но бывают странные периоды, когда пакеты последовательных вызовов функций выполняются наполовину без ошибок в журналах.

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

Не правильно ли я выполняю Обещания? Если функция firebase зависает, не испортит ли она следующие несколько вызовов функций?

exports.onNewUser = functions.firestore
    .document('/users/{userId}')
    .onCreate(async (snapshot, context) => {
        user = snapshot.data().username;

        //Notification payload
        const payload = {
            notification: {
                title: `New user!`,
                body: `${user} has joined [AppName]`
            }
        };
        var promises = [];
        //Check if usename unique
        var passed = true;
        promises.push(db.runTransaction(async t => {
            const docRef = db.collection('users').doc('index');
            const doc = await t.get(docRef);
            var newIndex = doc.data().usernames;
            if (newIndex[user.toUpperCase()] == true) {
                t.delete(snapshot.ref);
                passed = false;
                return null;
            } else {
                newIndex[user.toUpperCase()] = true;
                t.set(docRef, { 'usernames': newIndex });
            }
        }));
        if (!passed) return Promise.all(promises);

        //add new user to Algolia database
        const algoliasearch = require('algoliasearch');
        const algoliaClient = algoliasearch(functions.config().algolia.appid, functions.config().algolia.apikey);
        const collectionIndex = algoliaClient.initIndex(collectionIndexName);
        await saveDocumentInAlgolia(snapshot, collectionIndex);

        //Notify Admins
        db.collection('notificationTokens')
            .doc(admin1)
            .get().then((doc) => {
                if (doc.exists && doc.data().notificationToken != null)
                    promises.push(pushNotification(doc.data().notificationToken, payload));
            });
        db.collection('notificationTokens')
            .doc(admin2)
            .get().then((doc) => {
                if (doc.exists && doc.data().notificationToken != null)
                    promises.push(pushNotification(doc.data().notificationToken, payload));
            });
        return Promise.all(promises);
    });

1 Ответ

1 голос
/ 03 мая 2020

Просто измените

return Promise.all(promises);

на

return await Promise.all(promises);

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

...