我试图显示一个用户与他的电话联系人,也是我的应用程序的用户
我存储在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;
});
1条答案
按热度按时间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,可以完成异步操作。通过按如下方式修改代码,您将避免这种“不稳定”行为:
顺便说一句,如果你在
catch
块中只返回null
,你可以完全删除它。