我是firebase的新手,我正在努力学习如何创建用户。我的问题是,当我通过按钮使用createUserWithEmail完成块时,由于某种原因,不会生成唯一标识符uid。这可以防止我将相关的用户名和密码存储在JSON树中的uid下。我的代码如下(我使用“let databaseRef = FIRDatabase.database()。reference()”)将一个单独的swift文件中的databaseRef定义为全局常量。
@IBAction func createAccount(sender: AnyObject) {
var username = usernameField.text
var email = emailField.text
var password = passwordField.text
if username != "" && email != "" && password != "" {
FIRAuth.auth()?.createUserWithEmail(email!, password: password!, completion: { (user, error) in
databaseRef.child("users/(user.uid)/username").setValue(username)
databaseRef.child("users/(user.uid)/password").setValue(password)
databaseRef.child("users/(user.uid)/uid").setValue(user?.uid)
})
} else {
print("please complete all fields")
}
}
我知道uid不是由于两个原因而生成的。首先,当我运行上面的代码并输入每个文本字段的值时,应用程序崩溃了。其次,如果我删除处理设置值的代码并将其替换为print(user.uid),则返回值为nil。我错过了什么?我可以理解,uid是创建用户的一个非常重要的部分。
***这是我提出的解决方案
@IBAction func createAccount(sender: AnyObject) {
var username = usernameField.text
var email = emailField.text
var password = passwordField.text
if username != "" && email != "" && password != "" {
FIRAuth.auth()?.createUserWithEmail(email!, password: password!, completion: { (user, error) in
if let user = FIRAuth.auth()?.currentUser {
databaseRef.child("users/\(user.uid)/username").setValue(username)
databaseRef.child("users/\(user.uid)/password").setValue(password)
databaseRef.child("users/\(user.uid)/email").setValue(email)
print(user.uid)
} else {
print("no user")
}
})
} else {
print("please complete all fields")
}
答案 0 :(得分:2)
有兴趣的人2018年4月4日快速解决方案:
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
// guard against errors and optionals
guard error == nil else { return }
guard let user = user else { return }
let userObject = [
"uid": user.uid,
"username": username,
"password": password, // I don't recommend storing passwords like this by the way
"email": email
] as [String:Any]
databaseRef.child("users").child(user.uid).setValue(userObject)
}