如何等待firebase cloud函数完成后再调用下一个函数?(AngularFire)



我有一个注册函数submit(),它调用我的身份验证服务中的signup()函数,基本上是AngularFirebasecreateUserWithEmailAndPassword(...)。完成后,将调用我的数据服务中的另一个函数updateUserDocument。此函数在Firebase Firestore中查找用户文档。该文档由云函数functions.auth.user().onCreate(user.createProfile)创建,并在创建身份验证对象时触发。

使用云函数是设置所有初始用户属性的方便方法。云功能也让我很容易实现与谷歌和脸书等提供商的注册。

然而,问题是,在调用updateUserDocument函数之前,云函数没有时间完成,这导致它在Firestore中找不到文档。

问题:在运行updateUserDocument之前,等待云功能完成的好方法是什么。我可以从云函数发出某种事件吗?如果可以,我如何在客户端侦听它

提交功能(在/注册.ts中(

submit() {
if (!this.signUpForm.valid) {
return;
}
const {displayName, email, password } = this.signUpForm.value;
this.auth.signUp(email, password).pipe(
switchMap(({ user: { uid } }) => this.dataService.updateUserDocument({ uid, email, displayName: displayName })),
this.toast.observe({
success: 'Congrats! You are all signed up',
loading: 'Signing up...',
error: ({ message }) => `${message}`
})
).subscribe(() => {
this.router.navigate(['/create-profile']);
this.openVerticallyCentered('Welcome!')
});
}

云功能(在functions/src/user/index.ts中(

export const createProfile = async (userRecord: any) => {
const uid = userRecord.uid;
const email = userRecord.email;
const photoURL = userRecord.photoUrl || '';
const displayName = userRecord.displayName || '';
const firstName = userRecord.firstName || '';
const lastName = userRecord.lastName || '';
const country = userRecord.country || '';
const dateOfBirth = userRecord.dateOfBirth || '';
const address = userRecord.address || '';
const suburb = userRecord.suburb || '';
const state = userRecord.state || '';
const postCode = userRecord.postCode || '';
const homePhone = userRecord.homePhone || '';
const mobilePhone = userRecord.mobilePhone || '';
const memNum = userRecord.memNum || '';
const memDueDate = userRecord.memDueDate || '';
const timestamp = FieldValue.serverTimestamp();
const memType = userRecord.memType || '';
const memStatus = userRecord.memStatus || '';
const isAdmin = userRecord.isAdmin || false
//const newUserRef = db.doc(`users/${uid}`)
// Convert any date to timestamp for consistency
try {
return await db
.collection(`users`)
.doc(userRecord.uid)
.set({
uid: uid,
email: email,
photoURL: photoURL,
displayName: displayName,
firstName: firstName,
lastName: lastName,
country: country,
dateOfBirth: dateOfBirth,
address: address,
suburb: suburb,
state: state,
postCode: postCode,
homePhone: homePhone,
mobilePhone: mobilePhone,
memNum: memNum,
memType: memType,
memStatus: memStatus,
memDueDate: memDueDate,
lastLoginDate: timestamp,
joined: timestamp,
updated: timestamp,
isAdmin: isAdmin,
});
} catch (message) {
return console.error(message);
}
};

用于将函数导出到firebase函数的索引文件(/functions/user/index(

exports.authOnCreate = functions.auth.user().onCreate(user.createProfile);

我不依赖后端的触发器,而是使用云函数(可能是可调用函数(来执行该逻辑。

在";注册";cloud函数我会同时做这两件事,用createUserWithEmailAndPassword创建帐户,并在updateUserDocument中设置配置文件。

最新更新