我尝试阻止创建已存在的用户名。
这是我将用户名上传到数据库的代码:
ref?.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("username").setValue(self.createUserName.text)
如果用户名已经存在,这就是我尝试获取的代码
ref?.child("users")
.queryOrdered(byChild: "username")
.queryEqual(toValue: self.createUserName.text?.uppercased())
.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() {
print("")
}
}) { error in
print("")
}
数据库看起来像这样
Database_App {
users {
-3bSRmS4PHXUwsr7XbMBwgPozNfK2 {
username: "sebas.varela"
}
}
}
并在控制台中显示此行:
Consider adding ".indexOn": "username" at /users to your security rules for better performance
问题是我总是得到。这有什么问题?
答案 0 :(得分:2)
您只能查询直接位于您查询的引用下的值。对于您的情况,例如:
Database_App {
users {
-3bSRmS4PHXUwsr7XbMBwgPozNfK2: "sebas.varela"
}
}
这将在您的代码中起作用,但很难获得安全性和高性能。更常见的方法是使用额外的节点,将用户名映射到uid:
Database_App {
userNames {
"sebas,varela": "-3bSRmS4PHXUwsr7XbMBwgPozNfK2"
}
}
在这种情况下,节点基本上允许用户声明他们的名字。该系统的优点是密钥自动保证在服务器上是唯一的,不需要该部分的客户端代码。
您需要: