Превышен максимальный размер стека вызовов при возврате обещания после транзакции Firebase - PullRequest
0 голосов
/ 13 мая 2018

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

В настоящее время мойФункция выглядит следующим образом:

exports.myFunction = functions.https.onCall((data, context) => {
    //reference of a node from Firebase real-time database
    var db = admin.database().ref('node');

    return db.transaction(function(snap){
        if(snap){
          if(snap == 'value'){
            snap = 'new value';
          }
        }
        return snap;
    },
    function(error, committed, datasnapshot){
        if (error) {
          var userId = 'a user id';
          return admin.auth().deleteUser(userId).then(function() {
            return {msg: error.message};
          });
        }
        else if (!committed) {
          var userId = 'a user id';
          return admin.auth().deleteUser(userId).then(function() {
            return {msg: 'transaction aborted'};
          });
        }
        else{
          //transaction complete
          var database = admin.database().ref('another node');
          return db.once('value').then(function(snapshot){
            if(snapshot.val() == 'new value'){
                return database.set('some_data').then(function(datasnap){
                    return {msg: 'done'};
                });
            }
            else{
                return {msg: 'not done'};
            }
          }
        }
    });
}

Проблема в том, что эта функция выдает ошибку: «RangeError: Превышен максимальный размер стека вызовов».Кажется, что почему-то происходит бесконечный рекурсивный вызов функции, который вызывает эту ошибку.

Я пытался удалить return из return db.transaction () , но после этого, функция ничего не возвращает клиенту, откуда я вызываю эту функцию.

Почему эта функция ведет себя так?И что я должен изменить в своем коде, чтобы вернуть данные клиенту без ошибок?

...