使用firebase sdk的auth guard

时间:2017-09-27 16:03:49

标签: angular firebase firebase-authentication

我尝试检查当前用户是否存在(登录)并在auth guard中返回。

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    firebase.auth().onAuthStateChanged((user: firebase.User) => {
      if (user) {
        return true;
      }
      return false;
    });
  }

但我收到了这个错误:

  

声明类型既不是'无效的函数。也没有任何'必须回来   价值。

看起来返回语句没有链接到canActivate函数。

2 个答案:

答案 0 :(得分:1)

作为你的守护者可以激活方法,返回类型是布尔值,你不会返回任何你得到错​​误的东西。

您可以返回布尔值来解决此问题。但在你的情况下,我可以看到你的返回类型是可观察的,并且在observable中你想要返回true或false。

所以你改变了警惕。

你需要做以下两件事

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): : boolean | Observable<boolean> | Promise<boolean> {
     return firebase.auth().onAuthStateChanged((user: firebase.User) => {
      if (user) {
        return true;
      }
      return false;
    });
  }

您需要检查firebase.auth().onAuthStateChanged()的返回类型,通常这些方法返回observable。如果是这种情况,那么您需要将其更改为如下

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): : boolean | Observable<boolean> | Promise<boolean> {
     return firebase.auth().onAuthStateChanged().map((user: firebase.User) => {
      if (user) {
        return true;
      }
      return false;
    });
  }

答案 1 :(得分:1)

canActivate方法应返回Observable<boolean> | Promise<boolean> | boolean 您应该从onAuthStateChanged回调中创建一个Promise或可观察的:

 canActivate(next: ActivatedRouteSnapshot,
              state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return new Promise((resolve, reject) => {
      firebase.auth().onAuthStateChanged((user: firebase.User) => {
        if (user) {
          resolve(true);
        } else {
          this.router.navigate([ '/login' ], { queryParams: { returnUrl: state.url } });
          resolve(false);
        }
      });
    });
  }