В облачной функции Firestore отсутствуют некоторые документы onCreate. - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь отобразить пользователя с его телефонными контактами, которые также являются пользователями моего приложения

Я храню телефонные контакты пользователя в коллекции контактов «Firestore».

В каждом документе, который я создаю на Android, я оставляю поле "fuid" (UID друга) как ноль. Используя облачные функции, каждый раз, когда создается новый документ, я проверяю, совпадает ли его «paPho» (проанализированный номер телефона, например, +972123455) с существующим номером телефона пользователя. Если да, я помещу его uid в соответствующий документ «fuid».

На андроиде я покажу все контакты пользователя, для которых fuid не равен null, и идентификатор соответствия соответствует

Так как у каждого пользователя может бытьболее 500 контактов (все добавлено за очень короткое время) Я использую план Blaze

Он работает довольно хорошо, но, хотя в журнале не обнаружено ошибок, кажется, что onCreate иногда отсутствует.

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

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

const functions = require('firebase-functions');

exports.attachUserToNewContact = functions.firestore
    .document('contacts/{contactId}').onCreate((snap,contex) => {

        admin.auth().getUserByPhoneNumber(snap.data().paPho)
            .then(userRecord => {
                if (userRecord.uid) {
                    console.log(`userRecord phone ${snap.data().paPho} matching contact ${userRecord.uid}`);
                    admin.firestore().collection('contacts')
                    .doc(snap.data().id).update({fuid:userRecord.uid});
                }

                return 0;
            })
            .catch(error => {
                //There is no user record corresponding to the provided identifier
            });

        return 0;
    });

1 Ответ

2 голосов
/ 11 ноября 2019

Вы не возвращаете обещания, возвращаемые асинхронными методами (getUserByPhoneNumber() и update()), что может привести к некоторому «ошибочному» поведению облачной функции.

Как вы увидите в трех видеороликах об «Обещаниях JavaScript» из официальной серии видеороликов Firebase (https://firebase.google.com/docs/functions/video-series/)), вы ДОЛЖНЫ возвратить Обещание или значение в фоновой облачной функции, чтобы указатьплатформа, которую она завершила, и чтобы избежать ее, завершается до выполнения асинхронных операций.

Конкретно иногда случается, что ваша облачная функция завершается до завершения асинхронных операций,потому что return 0; в конце указывает платформе облачной функции, что она может завершить функцию. В других случаях платформа облачной функции не завершает функцию немедленно, и асинхронные операции могут быть завершены.

Byизменив код следующим образом, вы избежите этого «ошибочного» поведения:

const functions = require('firebase-functions');

exports.attachUserToNewContact = functions.firestore
    .document('contacts/{contactId}').onCreate((snap,contex) => {

        return admin.auth().getUserByPhoneNumber(snap.data().paPho)
            .then(userRecord => {
                if (userRecord.uid) {
                    console.log(`userRecord phone ${snap.data().paPho} matching contact ${userRecord.uid}`);
                    return admin.firestore().collection('contacts')
                    .doc(snap.data().id).update({fuid:userRecord.uid});
                } else {
                    return null;
                } 
            })
            .catch(error => {
                //There is no user record corresponding to the provided identifier
                return null;
            });

    });

Кстати, если вы не сделаете ничего, кроме возврата null в блоке catch, вы можете полностью удалитьэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...