AngularFire 2 AuthGuard多个请求

时间:2017-05-28 11:21:12

标签: angular angularfire2

我正在尝试向canActivate()中的Firebase发出多个请求,但TS编译器会标记错误:声明类型既不是'void'也不是'any'的函数必须返回一个值。 这是我正在尝试做的事情:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> {
      this.auth.take(1).map((authState : FirebaseAuthState) => {
        if(authState) {
        // Ok, so user is authenticated, let's check if it is admin
          return this.db.object(`/users/${authState.uid}`)
          .take(1)
          .map((user) => {
            if(user.isAdmin) {
            // Redirect admin user to /admin-panel
              this.router.navigate(['/admin-panel']);
              return true;
            } else {
             // It is normal user, continue
              return true;
            }
          })
        } else {
          // User not authenticated
          this.router.navigate(['/login']);
          return false;
        }
      })
  }

所以,我的问题是我不能在canActivate()

内发出多个请求

感谢。

2 个答案:

答案 0 :(得分:0)

您没有从canActivate返回任何内容,请将其更改为:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> {
      return this.auth.take(1).map((authState : FirebaseAuthState) => {
        if(authState) {
        // Ok, so user is authenticated, let's check if it is admin
          return this.db.object(`/users/${authState.uid}`)
          .take(1)
          .map((user) => {
            if(user.isAdmin) {
            // Redirect admin user to /admin-panel
              this.router.navigate(['/admin-panel']);
              return true;
            } else {
             // It is normal user, continue
              return true;
            }
          })
        } else {
          // User not authenticated
          this.router.navigate(['/login']);
          return false;
        }
      })
  }

答案 1 :(得分:0)

我找到了similar question。因此,可以使用mergeMap执行多个请求。