Транзакция Firebase вызывает ошибку функции? - PullRequest
0 голосов
/ 18 сентября 2018

Уже потратил немало часов, пытаясь выяснить следующее, надеюсь, кто-то мне подскажет.

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

Unhandled error RangeError: Maximum call stack size exceeded
    at Function.isNull

Несмотря на то, что транзакция корректно обновляет значение в базе данных.

Я пытался отладить его и удалить что-либоЯ могу.Поэтому, когда я удаляю транзакцию и использую, например, update(), функция завершается, как и ожидалось, с кодом 200.

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

Unhandled error RangeError: Maximum call stack size exceeded
    at Function.isNull (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:11950:20)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:217:11)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)

Другая похожая трассировка стека, которую я получил:

Unhandled error RangeError: Maximum call stack size exceeded
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13402:38
    at /user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:4911:15
    at baseForOwn (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:2996:24)
    at Function.mapValues (/user_code/node_modules/firebase-functions/node_modules/lodash/lodash.js:13401:7)
    at encode (/user_code/node_modules/firebase-functions/lib/providers/https.js:242:18)

Вот функция:

index.js:

    const statsModule = require("./stats")

    exports.myMethod9 = functions.https.onCall((data, context) => {
        console.log("updateStatsMessagesChangedFeedbackHttp: data = ", data)
        return statsModule.updateStatsMessagesChangedFeedbackHttp(data, context, admin);
    });

stats.js

exports.updateStatsMessagesChangedFeedbackHttp = function (data, context, admin) {
    var userId = "sdfsdf";
    var feedback = data.feedback;
    console.log("updateStatsMessagesChangedFeedbackHttp: userId = ", userId)
    return exports.updateStatsMessagesChangedFeedback(userId, feedback, admin);
}

exports.updateStatsMessagesChangedFeedback = function (userId, feedback, admin) {
    console.log("updateStatsMessagesChangedFeedback: feedback = ", feedback, ", userId = ", userId);

    var root = admin.database().ref().root;
    var path = constModule.statsUpdatedMessagesFeedbackPath + "/" + feedback;
    var statsRef = root.child(path);
    return statsRef.transaction(function (stats) {
        if(!stats) {
            stats = {votedUsers:{}, count: 0};
        }
        stats.votedUsers[userId] = true;
        console.log("updateStatsMessagesChangedFeedback: stats = ", stats)
        return stats;
    }, function (error, committed, snapshot) {
        //nothing wrong here - error is always null, committed - true

        var snapVal = snapshot ? snapshot.val() : null;
        console.log("error = ", error, ", committed = ", committed, ", data = ", snapVal);
        if (error) {
            // The fetch succeeded, but the update failed.
            console.error("updateStatsMessagesChangedFeedback: The fetch succeeded, but the update failed: ", error);
        } else {
            console.log("updateStatsMessagesChangedFeedback: all ok: data = ", snapVal);
        }
    })
    .catch(function (error) {
        //this is never called - all good here as well
        console.error("updateStatsMessagesChangedFeedback: error = ", error)
    });
}

Я вызываю его из клиентского веб-sdk следующим образом:

var call = firebase.functions().httpsCallable('myMethod9');dFeedbackHttp
call({feedback: "some data"}).then(function (result) {...})

Ни перехват, ни обратный вызов транзакции не показывают никаких ошибок.Хотя функция по-прежнему не работает, только если я использую транзакцию.

enter image description here (нажмите на изображение, чтобы увеличить его)

Любые идентификаторы того, что происходит?

1 Ответ

0 голосов
/ 20 сентября 2018

После обсуждения со службой поддержки (кстати, очень полезными, ребята!) Вот решение:

необходимо вернуть значение из функции в случае транзакции:

 exports.myMethod9 = functions.https.onCall((data, context) => {
        console.log("updateStatsMessagesChangedFeedbackHttp: data = ", data)
        return statsModule.updateStatsMessagesChangedFeedbackHttp(data, context, admin);
    }).then(function(){
        return {}
    });

IЯ не имею ни малейшего представления о том, почему возвращение значения имеет какое-либо значение, так как, например, update () возвращает void, что по-прежнему делает функцию завершенной с кодом 200.

Ожидание дальнейших комментариев формирует поддержку, а между тем, если кто-либоимеет любую информацию по этому вопросу, не стесняйтесь поделиться.

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