Firebase Cloud Async Error (функция вернула неопределенное, ожидаемое обещание или значение) - PullRequest
0 голосов
/ 05 марта 2019

Во-первых, заранее спасибо, что нашли время прочитать это.

Я работал над облачной функцией для моего приложения Firebase и столкнулся с некоторыми неприятными ситуациями.В половине случаев моя функция работает как положено;Я вижу все ожидаемые журналы, и БД обновляется правильно.Другая половина времени, кажется, почти останавливается на полпути;отображаются только некоторые журналы, и производится только половина ожидаемых обновлений БД.Я отлаживал это довольно давно и у меня заканчиваются идеи.

Одна вещь, которую я постоянно вижу в журналах, - это следующая ошибка:

Function returned undefined, expected Promise or value

IЯ не уверен, является ли эта ошибка причиной несоответствий, отмеченных выше, но это единственное преимущество, которое у меня есть на данный момент.К этому моменту я закомментировал почти весь код моей облачной функции, и ошибка, по-видимому, вызвана использованием функции async.auto.Как только я удалю любую ссылку на async, ошибка исчезнет.

Подводя итог моим вопросам: 1 - Почему использование async.auto вызывает вышеуказанную ошибку?2 - Является ли ошибка причиной несоответствия с результатом запуска моей облачной функции?

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

exports.updateLeaderboard = functions.database.ref('/contests/{dateString}/ladder/dayIsComplete').onWrite((event, context) => {
    const isComplete = event.after._data,
        contestType = 'ladder',
        dateString = context.params.dateString;

    if (isComplete !== true) {
        console.warn(`${contestType} for ${dateString} is not yet complete.`);

        return false;
    }

    async.auto({
        fetchWinningPicks: cb => {
            return cb();
        },

        // ... Other stuff that I've now commented out

    }, err => {
        if (err) {
            return false;
        } else {
            return true;
        }
    });
};

1 Ответ

0 голосов
/ 05 марта 2019

Мне удалось устранить ошибку, обернув мой async.auto поток в new Promise() и разрешив / отклонив мой последний обратный вызов:

exports.updateLeaderboard = functions.database.ref('/contests/{dateString}/ladder/dayIsComplete').onWrite((event, context) => {
    const isComplete = event.after._data,
        contestType = 'ladder',
        dateString = context.params.dateString;

    if (isComplete !== true) {
        console.warn(`${contestType} for ${dateString} is not yet complete.`);

        return false;
    }

    return new Promise((resolve, reject) => {
        async.auto({
            fetchWinningPicks: cb => {
                return cb();
            },

            // ... Other stuff that I've now commented out

        }, err => {
            if (err) {
                reject();
            } else {
                resolve();
            }
        });
    });
};

Похоже, это исправляет обе мои проблемы, описанные выше.

...