Подтвердить что ты не робот

Облачные функции для Firebase - Ошибка сериализации возвращаемого значения:

У меня есть функция облака, используемая для перекрестных ссылок на два списка и нахождения значений, которые соответствуют друг другу в списках. Кажется, что функция работает правильно, однако в журналах я вижу это Error serializing return value: TypeError: Converting circular structure to JSON. Вот функция...

exports.crossReferenceContacts = functions.database.ref('/cross-ref-contacts/{userId}').onWrite(event => {

    if (event.data.previous.exists()) {
        return null;
    }

    const userContacts = event.data.val();
    const completionRef = event.data.adminRef.root.child('completed-cross-ref').child(userId);
    const removalRef = event.data.ref;

    var contactsVerifiedOnDatabase ={};
    var matchedContacts= {};


    var verifiedNumsRef = event.data.adminRef.root.child('verified-phone-numbers');
    return verifiedNumsRef.once('value', function(snapshot) {

        contactsVerifiedOnDatabase = snapshot.val();

        for (key in userContacts) {
            //checks if a value for this key exists in `contactsVerifiedOnDatabase`
            //if key dioes exist then add the key:value pair to matchedContacts
        };

        removalRef.set(null); //remove the data at the node that triggered this onWrite function
        completionRef.set(matchedContacts); //write the new data to the completion-node

    });

});

Я попытался поставить return перед completionRef.set(matchedContacts);, но это все еще дает мне ошибку. Не уверен, что я делаю неправильно и как избавиться от ошибки. Спасибо за вашу помощь.

4b9b3361

Ответ 1

У меня была такая же проблема при возврате нескольких promises, которые были транзакциями в базе данных Firebase. Сначала я звонил:

return Promise.all(promises);

Мой объект promises - это массив, который я использую, когда я нажимаю все задания, которые нужно выполнить, вызывая promises.push(<add job here>). Я думаю, что это эффективный способ выполнения заданий, поскольку теперь задания будут выполняться параллельно.

Работала облачная функция, но я получал ту же самую ошибку, которую вы описали.

Но, как предложил Майкл Блей в своем комментарии, добавив then исправленную проблему, и я больше не вижу эту ошибку:

return Promise.all(promises).then(() => {
  return true;
}).catch(er => {
  console.error('...', er);
});

Если это не исправить вашу проблему, возможно, вам нужно преобразовать свой круглый объект в формат JSON. Здесь приведен пример, но я не пробовал: fooobar.com/questions/4328/... (он использует библиотеку round-json).

ОБНОВЛЕНИЕ Декабрь 2017: Похоже, что в новейшей версии Cloud Function функция облака ожидает возвращаемое значение (либо обещание, либо значение), поэтому return; приведет к следующей ошибке: Function returned undefined, expected Promise or value, хотя функция будет выполнена. Поэтому, когда вы не возвращаете обещание и хотите, чтобы функция облака завершилась, вы можете вернуть случайное значение, например. return true;

Ответ 2

Try:

return verifiedNumsRef.once('value').then(function(snapshot) {
    contactsVerifiedOnDatabase = snapshot.val();

    for (key in userContacts) {
        //checks if a value for this key exists in `contactsVerifiedOnDatabase`
        //if key dioes exist then add the key:value pair to matchedContacts
    };

    return Promise.all([
      removalRef.set(null), //remove the data at the node that triggered this onWrite function
      completionRef.set(matchedContacts)
    ]).then(_ => true);
});

Ответ 3

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

Первоначально мой код выглядел так:

return emergencyNotificationInformation.once('value', (data) => {
    ...
    return;
});

Но после добавления и catch ошибка исчезла.

return emergencyNotificationInformation.once('value')
    .then((data) => {
        ...
        return;
    })
    .catch((error) => {
        ...
        return:
    });
}