首页 文章

角度canActive与可观察

提问于
浏览
1

我在守卫中使用canActivate方法 . 在里面我有一个可观察的,它给了我一个对象 . 该对象有密码 . 我检查密码,如果是的话,我希望canActivate返回true,如果没有,则返回false .

这是代码

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const uid = route.params.userId;
    const hackId = route.params.hackId;
    const token = this.authService.token;
    const queryParamsPassword = route.queryParams.password;
    this.hacksStorageService.fetchHack(token, uid, hackId)
      .subscribe(
        hack => {
          const hackPassword = hack[0].password;
          if (queryParamsPassword === hackPassword ) {
            return true
          } else {
            this.router.navigate(["/"]);
            return false
          }
        },
        error => {
          return false;
        }
      )
  }

我无法理解响应 . 我必须在完成后给出响应 . 一旦我从订阅中获得了值,那么我想在canActivate中返回布尔值 .

我得到的错误是在canActivate方法(红色)

[ts]
Property 'canActivate' in type 'RoleGuard' is not assignable to the same property in base type 'CanActivate'.
  Type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => void' is not assignable to type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean | Observable<boolean> | Pr...'.
    Type 'void' is not assignable to type 'boolean | Observable<boolean> | Promise<boolean>'.

我以为我会回到if的每一个分支,所以它应该足够了,但显然不是 . 如果我退回订阅,他也会抱怨 .

有帮助吗?非常感谢 .

1 回答

  • 2

    你的方法必须返回一些东西它没有返回任何东西 .

    它可以返回一个布尔值 . 只有在您可以知道要同步返回的值时,才有可能 . 但是你需要一个异步调用才能知道结果应该是什么 . 所以你可以't return a boolean. And that'为什么警卫也可以返回 Observable<boolean> . 所以,这样做:

    return this.hacksStorageService.fetchHack(token, uid, hackId).pipe(
      map(hack => {
        const hackPassword = hack[0].password;
        if (queryParamsPassword === hackPassword ) {
          return true;
        } else {
          this.router.navigate(["/"]);
          return false;
        }
      })
    );
    

相关问题