首页 文章

使用firebase sdk的auth guard

提问于
浏览
0

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

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

但我得到了这个错误:

声明类型既不是'void'也不是'any'的函数必须返回一个值 .

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

2 回答

  • 1

    作为你的守卫canActivate方法返回类型是布尔值,你不会返回任何你得到错误的东西 .

    您可以返回布尔值来解决此问题 . 但在你的情况下,我可以看到你的返回类型是可观察的,并且在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

    canActivate 方法应该返回 Observable<boolean> | Promise<boolean> | boolean 你应该从 onAuthStateChanged 回调中创建一个promise或observable:

    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);
            }
          });
        });
      }
    

相关问题