我有一个场景,我需要使用Auth
创建用户,并向Firestore数据库添加更多信息(例如名称和业务类型)。 Firestore作为事务/批处理操作,但仅适用于Firestore。
有没有办法可以执行Auth
操作,例如与Firestore数据插入一起创建。两种操作都必须成功或失败。现在我链接他们,但我担心一个人失败,另一个成功需要优雅地处理。
谢谢
答案 0 :(得分:2)
在实施Firebase身份验证时,您可以使用addOnCompleteListener
或addOnSuccessListener
并实施isComplete()
或isSuccessful()
方法。在其中一种方法中,您需要在Firestore数据库中创建用户。换句话说,只有在身份验证成功的情况下才会创建用户。因此,如果isSuccessful()
其中一个方法下的所有操作都成功,或者没有应用任何操作。
这两种方法之间的区别在于,当完成该任务所代表的工作时,无论其成功与否,我们都可以complete
。可能存在或可能没有错误,但我们需要检查错误。当任务所代表的工作按预期完成时,任务为successful
,没有错误。
总之,没有办法获得批量解决方案。这是因为有2个单独的操作。因此,为了能够在数据库中编写用户详细信息,您需要首先成功通过身份验证。如果要进行回滚,则在将用户详细信息写入数据库时需要再次使用addOnCompleteListener。如果你得到一个错误只是罪恶的用户。没有事务/批处理操作可以处理您所描述的身份验证和数据库写操作。
修改强>
由于您说您正在使用Firebase身份验证,因此您还可以使用以云功能编写的功能来实现目标。您可以编写一个函数,该函数将在项目中的某些内容发生时运行。其中一个“事物”是creation of an user。换句话说,您可以在每次创建新用户时执行逻辑。这是一个例子:
exports.updateUserCount = functions.auth.user().onCreate((user) => {
//Do what you need to do
});
此外,您可以在删除用户时执行相同操作,但使用onDelete()
方法注册函数。
这将非常快,因为没有与用户设备的交互。请参阅有关Firebase Cloud Functions的更多信息。
答案 1 :(得分:2)
执行此类方案的最佳方法是使用Firebase Cloud Functions
。云功能在各种创建/更新/删除/写入操作上触发。您可以在创建新用户时触发云功能,然后在其中进行相关的Auth
创建。
https://firebase.google.com/docs/firestore/extend-with-functions
因此,在这种情况下,您首先创建用户数据,然后成功创建该数据,称为Firebase Auth用户创建。如果您担心失败的情况,则可以删除创建的用户,以防身份验证创建失败。
答案 2 :(得分:-1)
如果您想同时进行身份验证,并且还希望将其他详细信息保存在FireStore中,那么您也可以采用这种方式。
如果让email = emailTextfield.text,让密码= passwordTextfield.text,让sendername = nameTextField.text {
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
if let e = error {
self.showAlert(e.localizedDescription)
}
else{
self.db.collection(K.FStore.registeredDetails).addDocument(data: [K.FStore.registeredName : sendername,
K.FStore.registeredEmail : self.emailTextfield.text!
])
self.performSegue(withIdentifier: K.registerSegue, sender: self)
}
}
}