Angular 6-Firebase-成功登录后路由无法正确进行

时间:2019-06-05 12:16:30

标签: angular typescript firebase-authentication angular6 angular2-routing

花了很多时间来解决我的问题,但未能解决。另外,我遇​​到过SO的相关主题,但仍然找不到解决此问题的解决方案。

问题

成功注册后,我收到了 true 的电子邮件验证标志。但是当我尝试使用相同的凭据重新登录时,路由到“主页”页面并没有发生。我不知道该怎么做post方法。

到目前为止有什么!!

firebase-service.ts

export class FireBaseAuthenticationService {
  userData: any;
  constructor(
    public afs: AngularFirestore,
    public afAuth: AngularFireAuth,
    public router: Router,
    public ngZone: NgZone
  ) {
    this.afAuth.authState.subscribe(user => {
      if (user) {
        this.userData = user;
        localStorage.setItem('customerInfo', JSON.stringify(this.userData));
        JSON.parse(localStorage.getItem('customerInfo'));
      } else {
        localStorage.setItem('customerInfo', null);
        JSON.parse(localStorage.getItem('customerInfo'));
      }
    });
  }
  userLogin(email, password) {
    return this.afAuth.auth.signInWithEmailAndPassword(email, password)
      .then((result) => {
        this.ngZone.run(() => {
          this.router.navigate(['home']);
        });
        this.setCustomerInfo(result.user);
      }).catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        console.log('err', errorMessage);
      })
  }
}

user-login.html

<fieldset class="clearfix">
            <p><span class="fa fa-user"></span><input type="text" Placeholder="Username" required #userName ></p>
            <p><span class="fa fa-lock"></span><input type="password" Placeholder="Password" required #userPassword></p>
            <div id="submit-btn">

              <span class="spn-submit"><input type="submit" value="Sign In"  (click)="authenticate.userLogin(userName.value, userPassword.value)"></span>
            </div>
          </fieldset>

预期:

  1. 成功登录后,我要转到“主页”页面。

但现在,登录页面的加载时间为几秒钟,并且保持不变。

pls,让我知道需要更多信息。

请不要将其标记为重复项,我已经挖掘了SO以找到解决方案。但我失败了

感谢所有人

1 个答案:

答案 0 :(得分:1)

您正在通过服务进行重定向,因此请使用do运算符或返回可观察到的内容并在组件中进行重定向。

使用操作符

userLogin(email, password) {
    return this.afAuth.auth.signInWithEmailAndPassword(email, password)
      .do((result) => {
        this.ngZone.run(() => {
          this.router.navigate(['home']);
        });
        this.setCustomerInfo(result.user);
      }).catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        console.log('err', errorMessage);
      })
  }

我在.do()内进行了导航,因为成功登录将始终导航到当前设置的重定向URL。

如果始终不这样做,那么router.navigate将是错误的。但是,考虑到总是这样做,那么这种方法可以确保一致性。

在组件中创建方法并从组件中重定向。

// service code
 userLogin(email, password) {
    return this.afAuth.auth.signInWithEmailAndPassword(email, password);
  }
}


// component code
userLogin(email, password) {
  this.authService.userLogin(email, password).then((result) => {
    this.ngZone.run(() => {
      this.router.navigate(['home']);
    });
    this.setCustomerInfo(result.user);
  }).catch((error) => {
    const errorCode = error.code;
    const errorMessage = error.message;
    console.log('err', errorMessage);
  })
}