Firebase事务触发函数错误?

时间:2018-09-18 15:42:00

标签: firebase google-cloud-functions

已经花了几个小时试图找出以下内容,希望有人可以指点我。

总之,发生了什么:我有一个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) {...})

catch或事务回调均未显示任何错误。尽管仅当使用事务时,该功能仍然会失败。

enter image description here (点击图片放大)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

与支持人员讨论后(非常有帮助的人!),这里是解决方法:

如果发生交易,则需要从函数返回值:

map

我不知道为什么在这里返回值会有所不同,例如,update()返回void仍使函数以代码200完成。

等待进一步的评论成为支持,同时,如果有人对此有任何信息,随时可以分享。