繁体   English   中英

如果用户名已在使用中,请检查Firebase数据库

[英]Check Firebase database if username is already in use

我正在尝试验证用户输入的用户名是否已被使用。 该代码当前检查电子邮件是否在使用中,如果不存在则创建用户。 如何使它读取数据库以查看用户名是否已被使用?

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
    }
}

您可以做的是创建另一个孩子,例如“ takenUsernames”,并将所有用户名存储在此处。 像这样,即使用户未通过身份验证,您也可以检查用户是否被盗。 您还必须将规则添加到数据库中。

数据库规则:

"takenUsernames": {
        ".read": true,
        ".write": "auth != null",
        "$username": {
        ".validate": "!root.child('takenUsernames').hasChild($username)"
        }
      }

在Swift中,您可以这样操作,其中用户名是textField中的值。 它基本上只是获取用户名,并检查takenUsername子级中是否存在该用户名:

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
}

现在,每次注册用户时,您都必须将键值对添加到takeedUsernames子级中。 就我而言,我是这样做的:

usernamesRef.updateChildValues([username:uid])

希望您能明白。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM