после нескольких вопросов и ответов о механизме транзакций, я пытаюсь запустить транзакцию на низком узле
вот мои данные:
activeOffers
-LKohyZ58cnzn0vCnt9p
details
direction: "city"
seatsCount: 2
timeToGo: 5
uid: "-ABSIFJ0vCnt9p8387a" ---- offering user
Я пытаюсь запустить транзакцию на -LKohyZ58cnzn0vCnt9p и выполнить следующее:
- уменьшить количество посадочных мест на некоторое запрошенное значение , если имеется достаточно мест
- добавить сделку с подузлами в ** -LKohyZ58cnzn0vCnt9p ** с запрошенным значением и идентификатором запрашивающего пользователя.
Но, очевидно, я делаю это неправильно, потому что получаю Максимальный размер стека вызовов превысил даже только для шага 1.
Вот мой код:
( entryRef - ссылка на -LKohyZ58cnzn0vCnt9p )
dealSeats = function(entryRef, data) {
const TAG = '[dealSeats]: ';
return entryRef.transaction((current)=>{
if (current) {
if (current.details.seatsCount >= data.details.seatsCount) {
current.details.seatsCount -= data.details.seatsCount;
}
}
return current;
});
}
================ Обновление после комментария Фрэнка ван Пуффелена ===============
Я не вижу никакой рекурсии в моем потоке:
Я вызываю облачную функцию в Почтальоне, отправляя следующие данные:
{
"data":
{
"uid": "-FGKKSDFGK12387sddd", ---- the requesting/asking user
"id": "-LKpCACQlL25XTWJ0OV_",
"details":
{
"direction": "city",
"seatsCount": 1,
"timeToGo": 5
}
}
}
===== index.js =====
entries = require('./entries');
/// cloud function
exports.TEST_askOfferSeats = functions.https.onCall((data, context) => {
console.log('data: ' + JSON.stringify(data));
return entries.askSeats(data);
});
===== records.js =======
exports.askSeats = function(data) {
const TAG = '[askSeats]: ';
var entryRef = db.ref('activeOffers/' + data.id);
return globals.exists(entryRef)
.then((found)=>{
if (found) {
return dealSeats(entryRef, data);
} else {
return 'Offer not found [' + data.id + ']';
}
});
}
и вот трассировка стека в журнале ошибок:
function:
TEST_askOfferSeats
event message:
Unhandled error RangeError: Maximum call stack size exceeded
at Function.mapValues (/user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:13395:23)
at encode (/user_code/node_modules/firebase-
functions/lib/providers/https.js:204:18)
at /user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:13400:38
at /user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:4925:15
at baseForOwn (/user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:3010:24)
at Function.mapValues (/user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:13399:7)
at encode (/user_code/node_modules/firebase-
functions/lib/providers/https.js:204:18)
at /user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:13400:38
at /user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:4925:15
at baseForOwn (/user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:3010:24)
at Function.mapValues (/user_code/node_modules/firebase-
functions/node_modules/lodash/lodash.js:13399:7)
У меня нет никаких триггеров или чего-то, что могло бы вызывать снова и снова один и тот же код ...