Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 被动表单,检查用户名是否存在_Javascript_Ionic Framework_Firebase Realtime Database_Async Await_Customvalidator - Fatal编程技术网

Javascript 被动表单,检查用户名是否存在

Javascript 被动表单,检查用户名是否存在,javascript,ionic-framework,firebase-realtime-database,async-await,customvalidator,Javascript,Ionic Framework,Firebase Realtime Database,Async Await,Customvalidator,我在Ionic/Firebase中遇到了一个问题,验证器的值为反应形式。特别是我下面有2个函数,用于检查firebase实时数据库中是否存在用户名。这两个函数返回一个承诺布尔值: export class UsernameValidator { static async getSnapshot(fc: FormControl){ let isPresent:boolean = false; await firebase.database().ref().child("

我在Ionic/Firebase中遇到了一个问题,验证器的值为反应形式。特别是我下面有2个函数,用于检查firebase实时数据库中是否存在用户名。这两个函数返回一个承诺布尔值:

export class UsernameValidator {
  static async getSnapshot(fc: FormControl){
    let isPresent:boolean = false;
    await firebase.database().ref().child("users").orderByChild("username")
    .equalTo(fc.value)
    .once("value", snapshot => {          
    }).then((data)=> {
      if(data.exists())
        isPresent = true;
      else
        isPresent = false;
    });
    console.log(isPresent);
    return isPresent; 
  }

  static async validUsername(fc: FormControl){
    try{
      let present:boolean =await UsernameValidator.getSnapshot(fc)
      if(present==true)
      return  (null);         
   else{
      return ({validUsername: true}); 
    } 
      }catch(e){
        console.log(e)
      }         
  }
然后,我有一个I类,我在其中定义了一个FormGroup和validator:

constructor(private route: ActivatedRoute, private router: Router, 
              public pfService: ProfileService, public fb: FormBuilder,
              public authService: AuthenticationService) 
  {
    this.id = this.authService.userData.uid;
    //Underscore and dot can't be next to each other (e.g user_.name).
    //Underscore or dot can't be used multiple times in a row (e.g user__name / user..name).
    this.validPattern = "^(?=.{6,20}$)(?!.*[_.]{2})[a-z0-9._]+$"; 
    this.validPatternName = "^[a-z]{3,10}$";
    this.userForm = fb.group({
      txtUsername:  ["",[Validators.required,Validators.pattern(this.validPattern),
                                                  UsernameValidator.validUsername]],
      txtName:     ["",[Validators.required,Validators.pattern(this.validPatternName)]],
    });
    this.userForm .valueChanges.subscribe(()=> {
      console.log(this.userForm.getError('validUsername'))
      })
  };

问题是,无论isPresent的值是多少,控制台中的validUsername始终为null,如果isPresent为false,也是如此。我怎样才能解决这个问题?

你很接近,但是你在试图解决这个问题时混合了不同的语法,这导致了混乱

另一件让你陷入麻烦的事情是混淆两种不同类型的语言

  • 对于直接引用(例如
    database().ref(“path/to/data”)
    ),可以使用
    exists()
    val()
    获取有关该位置数据的信息
  • 对于查询的引用(例如
    database().ref(“path/to/group”).orderByChild(“name”).equalTo(“Tim's group”)
    ),数据作为列表返回,您可以使用
    numChildren()
    获取匹配结果的数量,
    haschilds()
    查看是否有任何结果(类似于
    exists()
    )您可以使用
    forEach()
    对结果进行迭代
static async isusernameake(fc:FormControl){//从getSnapshot()重命名
return firebase.database().ref()//注意此处的返回
.child(“用户”)
.orderByChild(“用户名”)
.equalTo(燃料价值)
.一次(“价值”)
.then((querySnapshot)=>querySnapshot.haschilds());
}
但是,我不建议只搜索用户名,因为这意味着用户的数据是世界可读的,而且效率也很低。相反,您应该在数据库中创建一个只包含用户名的索引

“/usernames”:{
“bob”:“userId1”,
“frank”:“userId2”,
“c00lguy”:“userId3”
}
如果您使用这些来保护它,还可以使用以下简单函数

{
“用户名”:{
“$username”:{
//世界可读
“.read”:正确,
//必须登录才能编辑,您只能声明免费用户名或删除拥有的用户名
“.write”:“auth!=null&(!newData.exists()| | auth.uid==newData.val())&(!data.exists()| | data.val()==auth.uid)”,
//仅限字符串
“.validate”:“newData.isString()”,
}
}
}
要检查用户名是否可用,请执行以下操作:

静态异步IsUsernameTake(fc:FormControl){
返回firebase.database().ref()
.child(“用户名”)
.child(fc.值)
.一次(“价值”)
.then((dataSnapshot)=>dataSnapshot.exists());
}
要声明用户名(如果写入本身失败,则假定已使用用户名):

静态异步claimUsername(fc:FormControl){
const user=firebase.auth().currentUser;
如果(!用户){
抛出新错误(“您需要先登录!”)
}
返回firebase.database().ref()
.child(“用户名”)
.child(fc.值)
.set(user.uid);
}

Wow great answer@samthecodingman,我是firebase的新手,有些事情我还不知道。非常感谢您提供的解决方案,感谢您对数据快照的解释以及对用户名的建议,我会这样做的。