我正在尝试验证用户输入的用户名是否已被占用。代码当前检查电子邮件是否正在使用,如果用户不存在则创建用户。我怎样才能读取数据库以查看用户名是否已被占用?
FIRAuth.auth()?.createUser(withEmail: email!, password: password!) { (user, error) in
if error?._code == (FIRAuthErrorCode.errorCodeInvalidEmail.rawValue)
{
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()
ref.child("Users").observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
if snapshot.hasChild(name!){
ref.child("users").child((user?.uid)!).setValue(["username": name])
print("true rooms exist")
} else {
self.displayMyAlertMessage(userMessage: "Username already in use. Please choose another.")
print("false room doesn't exist")
}
})
} else {
self.displayMyAlertMessage(userMessage: "Email already in use. Please see the login page.")
return
}
}
答案 0 :(得分:2)
你可以做的是创建另一个孩子,例如" takenUsernames",将所有用户名存储在那里。就像这样,即使用户未经过身份验证,您也可以检查用户是否被接听。您还必须将规则添加到数据库中。
数据库规则:
"takenUsernames": {
".read": true,
".write": "auth != null",
"$username": {
".validate": "!root.child('takenUsernames').hasChild($username)"
}
}
在Swift中你可以这样做,其中username是textField的值。它基本上只需要用户名并检查在takeUsername子项中是否存在:
let usernamesRef = FIRDatabase.database().reference().child("takenUsernames")
usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
//Username is already taken
} else {
//Username doesn't exist, do your stuff
}
现在每次注册用户时,都必须将key value对添加到takenUsernames子项中。就我而言,我这样做:
usernamesRef.updateChildValues([username:uid])
我希望你明白这一点。