我正在使用Firebase Stripe扩展。
将用户添加到Firebase时,Stripe扩展使用云函数在Firestore数据存储中创建users
文档。
在我的应用程序中,我有一个函数可以创建一个Firebase用户,然后尝试更新匹配的users
Firestore文档。
但有时云函数还没有完成创建users
文档,它会返回以下错误:
No document to update: projects/APP_NAME/databases/(default)/documents/users/KHaY21FSUasdfOXFS123Kfge85VA3
为了解决这个问题,我使用了一个timeout
,它在继续之前会暂停几秒钟。这不是一个理想的解决方案。
相反,我想知道Firebase Stripe扩展是否在继续之前完成了users
文档的创建。
如何做到这一点?
这是我的应用程序功能:
export const useCreateUserWithEmailAndPasswordTask = () => {
const updateDocTask = useUpdateDocTask();
return useTask(function* (
signal,
email: string,
password: string,
firstName: string,
lastName: string,
) {
// Create the user in Firebase
// The Firebase Stripe extension will now use Cloud Functions to also create a 'users' doc with related user info
const userCredential: UserCredential = yield createUserWithEmailAndPassword(
auth,
email,
password
);
// Now I wait 3 seconds to make sure the 'users' doc is created before updating it.
// Without this timeout it will occasionally throw an error because updateDocTask is called before the 'users' doc is created
// Is there a better way of doing this?
yield timeout(3000);
const updateDoc: void = yield updateDocTask.perform(
'users',
userCredential.user.uid,
{
firstName: firstName,
lastName: lastName,
createdAt: timestamp,
}
);
return Promise.all([userCredential, updateDoc]);
});
};
您可以使用实时侦听器而不是setTimeout()
,如下所示:
import { doc, onSnapshot } from "firebase/firestore";
const unsub = onSnapshot(doc(db, "users", "<USER_DOC_ID>"), (doc) => {
// This function triggers whenever the document is created/updated/deleted
console.log("Data: ", doc.data());
});
请检查doc.data()
是否已经有数据,以防扩展在用户到达此页面之前添加了文档。