NodeJS firestore云函数缺少一些onCreate文档

ecbunoof  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(103)

我试图显示一个用户与他的电话联系人,也是我的应用程序的用户
我存储在Firestore“联系人”集合的用户电话联系人。
在我在android上创建的每个文档上,我都将“fuid”(朋友UID)字段保留为null。使用云函数,每次创建新文档时,我都会检查他的“paPho”(解析的电话号码,例如,+972123455)匹配现有的用户电话号码。如果是的话,我会把他的uid放到“fuid”匹配的文档中。
在android上,我将显示所有fuid不为null且uid匹配的用户联系人
由于每个用户可能有超过500个联系人(所有在很短的时间内添加),我使用火焰计划
它工作得很好,但是,尽管在日志中没有发现错误,**似乎有时候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;
    });
uurv41yg

uurv41yg1#

您没有返回异步方法(getUserByPhoneNumber()update())返回的promise,这可能会导致Cloud Function的一些“不稳定”行为。
正如您将在官方Firebase视频系列(https://firebase.google.com/docs/functions/video-series/)中关于“JavaScript Promises”的三个视频中看到的那样,您必须在后台触发的Cloud Function中返回一个Promise或一个值,以向平台表示它已经完成,并避免它在异步操作完成之前被终止。
具体来说,有时会发生云函数在异步操作完成之前被终止的情况,因为结尾的return 0;向云函数平台表明它可以终止函数。其他时候,Cloud Function平台不会立即终止Function,可以完成异步操作。
通过按如下方式修改代码,您将避免这种“不稳定”行为:

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;
            });

    });

顺便说一句,如果你在catch块中只返回null,你可以完全删除它。

相关问题