Уже потратил немало часов, пытаясь выяснить следующее, надеюсь, кто-то мне подскажет.
Короче, что происходит: у меня есть функция 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) {...})
Ни перехват, ни обратный вызов транзакции не показывают никаких ошибок.Хотя функция по-прежнему не работает, только если я использую транзакцию.
(нажмите на изображение, чтобы увеличить его)
Любые идентификаторы того, что происходит?