транзакция firebase на нижнем узле - превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 27 августа 2018

после нескольких вопросов и ответов о механизме транзакций, я пытаюсь запустить транзакцию на низком узле

вот мои данные:

activeOffers
    -LKohyZ58cnzn0vCnt9p
        details
            direction: "city"
            seatsCount: 2
            timeToGo: 5
        uid: "-ABSIFJ0vCnt9p8387a"    ---- offering user

Я пытаюсь запустить транзакцию на -LKohyZ58cnzn0vCnt9p и выполнить следующее:

  1. уменьшить количество посадочных мест на некоторое запрошенное значение , если имеется достаточно мест
  2. добавить сделку с подузлами в ** -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)

У меня нет никаких триггеров или чего-то, что могло бы вызывать снова и снова один и тот же код ...

1 Ответ

0 голосов
/ 28 августа 2018

И, наконец, это было очень глупо с моей стороны. Если я хочу использовать транзакцию, возвращающую обещание, я должен поставить

  .then((success)=>{   ...   }

после транзакции. i.e.:

 return entryRef.transaction((current)=>{
    if (current) {
        if (current.details.seatsCount >= data.details.seatsCount) {
            current.details.seatsCount -= data.details.seatsCount;
        }
    }
    return current;
})
.then((success)=> {
.......
});

И теперь все хорошо:)

...