我想在有人注册时停止重复的用户名,我已经进行了查询以检查用户名是否存在以注册新的用户名。 但是!当我使用2个设备同时注册相同的用户名时,它会创建两个相同的用户名!我不希望这种情况发生。
以下是查询:
let username = self.usernameTxt.text
let userRef = ref.child("users/\(username)")
userRef.observe(.value, with: { snapshot in
if snapshot.exists() {
print("Username Already taken!")
} else {
self.signupUser() // Create new username
}
userRef.removeAllObservers()
}, withCancel: { error in
print(error)
})
数据库看起来像这样: Database Image
以下是Firebase规则:
{
"rules": {
".read": "(auth != null)",
".write": "(auth != null)",
"users" :{
".indexOn": ["username"],
"$uid":{
".read": "(auth != null) ",
".write": "(auth != null)",
".validate": "newData.isString()"
}
}
}
}
SignupUser()代码:
func signupUser() {
FIRAuth.auth()?.createUser(withEmail: self.emailTxt.text!, password: self.passwordTxt.text!, completion: {
(user, error) in
if let error = error {
let alertController = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}
if let user = user {
let changeRequest = FIRAuth.auth()!.currentUser!.profileChangeRequest()
changeRequest.displayName = self.usernameTxt.text!
changeRequest.commitChanges(completion: nil)
let imageRef = self.userStorage.child("\(user.uid).jpg")
let data = UIImageJPEGRepresentation(self.profilepic.image!, 0.5)
let uploadTask = imageRef.put(data!, metadata: nil, completion: { (metadata, error) in
if error != nil {
print(error!.localizedDescription)
}
imageRef.downloadURL(completion: { (url, error) in
if error != nil {
print(error!.localizedDescription)
}
if let url = url {
let userInfo: [String : Any] = ["uid" : user.uid,
"urlToImage" : url.absoluteString,
"email" : self.emailTxt.text!,
"username" : self.usernameTxt.text!,
]
self.ref.child("users").child(user.uid).setValue(userInfo)
self.performSegue(withIdentifier: "home", sender: self)
}
})
})
uploadTask.resume()
}
})
}
如果我在注册之前删除了用户名检查,它将继续创建相同的用户名,如复制它们。此外,如果有一个检查,并且有两个客户端创建相同的用户名,同时它将创建它们。 我想要的是,如果用户名存在,请停止注册过程,并显示警告说用户名已被占用!
答案 0 :(得分:0)
根据您共享的数据库快照,您将用户名存储在“users / autogeneratedId / \(username)”节点。
但根据您的代码,您正在“users / \(username)”节点检查重复的用户名。
因此,每次if语句返回false,因为它在“users / \(username)”节点上找不到任何用户名。所以else语句被执行。
可能的解决方案是您必须将用户名存储在“users / \(username)”节点。请检查您的插入用户名代码。