角authState.subscribe对我不起作用。我调用了本地存储,但它是空的,但是在我再次调用它之后,它就可以工作了

时间:2020-06-08 00:03:18

标签: javascript angular firebase-authentication angularfire2

我用于保存用户信息的代码,在授权服务文件中的10个使用Angular身份验证的示例中,有9个是这样的:

 constructor(    
    public afAuth: AngularFireAuth, // Inject Firebase auth service
    private router: Router
  ) {
      this.afAuth.authState.subscribe(user => {
      if (user) {
        alert('subscribe' + user);
        this.userData = user;
        localStorage.setItem('user', JSON.stringify(this.userData));
      } else {
        localStorage.setItem('user', null);
      }
    })
 }

这是我访问本地存储的方式,例如在isLoggedIn方法中:

get isLoggedIn(): boolean {
  const user = JSON.parse(localStorage.getItem('user'));
  return (user !== null && user.emailVerified !== false) ? true : false;
}

收到上述消息后,用户为NULL。

这是调用此方法的地方(警卫队):

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router} from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from '../services/auth.service';

@Injectable({
  providedIn: 'root'
})

export class AuthGuard implements CanActivate {

  constructor(
    public authService: AuthService,
    public router: Router
  ) {}

  /* Secure your app�s routes from unauthorized access using canActivate() route guard method.
  This method is pretty helpful when we need to secure our app�s URL.*/
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    if (this.authService.isLoggedIn !== true) {
      this.router.navigate(['login']);
    }

    return true;
  }
}

这是我得到的解决方法,由于我提到的每个示例都使用上面的“订阅”解决方案,因此我不确定这是最好的解决方法:

public get currentUser(): firebase.User {
  return this.afAuth.auth.currentUser;
}

问题:登录后,当我的程序访问localstorage时为null。然后,我再次登录并工作。好像订阅发生的时间比我的登录晚(异步?)。它可以工作,但是已经很晚了,因为它第一次返回null。

如果您从上方看,我会发出警报:alert('subscribe' + user)。我得到了警报,但是正如我所说,“反应”需要一段时间。我需要在登录后但尝试访问本地存储之前进行该操作。

我对Angular,Javascript和Firabase完全陌生。

谢谢。

0 个答案:

没有答案