繁体   English   中英

Angular 中的异步电子邮件验证

[英]Asynchronous email validation in Angular

我想编写一种方法来验证 Firebase 身份验证数据库中是否已存在电子邮件。 因此,如果用户键入电子邮件,则应检查数据库是否已存在。 如果是这样,我想使用 FormControl 以 HTML 格式显示消息。

这是我编写的方法的代码:

checkEmail(control:FormControl): Promise<any> | Observable<any>{
    const answer = new Promise<any>((resolve, reject) => {
      setTimeout(() => {
        if(control.value === "someone@hotmail.com"){
          resolve({'emailTaken': true})
        }else{
          resolve(null);
        }
      },1500);
    });
    return answer;
  }

如您所见,它正在检查静态值(“someone@hotmail.com”)。 如果该电子邮件已经存在,我希望能够检查我数据库中的所有用户。 我在想也许我可以通过获取数据库中所有用户的列表来解决这个问题,将它们放在一个列表中,然后遍历列表以查看电子邮件是否等于用户输入。 但是我还没有为此找到一个 Firebase 函数,因此我们将不胜感激!

*编辑:这是我的服务代码:

import { Injectable } from '@angular/core';
import * as firebase from 'firebase';
import { LoginComponent } from './login/login.component';
import { stringify } from 'querystring';
import { Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AuthService {

  token:string;

  constructor(private router: Router) {

    if(localStorage.getItem('token')) {
      this.token = localStorage.getItem('token');
    }

   }

  signup(email:string, passwd:string){
    firebase.auth().createUserWithEmailAndPassword(email, passwd).catch(
      error=> console.log(error)
    );
  }

  isLoggedIn(){
    return localStorage.getItem('token');
  }

  login(email:string, passwd:string){
    return firebase.auth().signInWithEmailAndPassword(email, passwd).then( 
      () => {
        firebase.auth().currentUser.getIdToken().then((token:string) => {
          this.token = token;
          localStorage.setItem('token', token);
        });
        this.router.navigateByUrl('');
        return true;
      }).catch(
        error => {
          console.log(error);
          return false;
        }

      );
  }

  getToken(){
    firebase.auth().currentUser.getIdToken().then(
      (token:string) => this.token = token
    );
    return this.token;
  }

  logout(){
    firebase.auth().signOut();
    this.token = null;
    localStorage.removeItem('token');
    this.router.navigate(['/Login']);
  }
}

您绝对应该创建一个调用 FireBase 的服务。 在您的代码片段中,您没有发送任何请求。 创建服务后,您应该使用.valueChanges订阅您的输入字段,并在.subscribe方法中通过服务检查它的有效性。

要检查用户是否已使用给定的电子邮件地址注册,请调用fetchSignInMethodsForEmail方法 有关如何调用此方法的示例,请参阅 Firebase 文档关于区分不同提供商的帐户

暂无
暂无

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

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