Облачные функции для 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);
, но это все еще дает мне ошибку. Не уверен, что я делаю неправильно и как избавиться от ошибки. Спасибо за вашу помощь.
Ответы
Ответ 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:
});
}