【问题标题】:implementing canActivate auth guard in angular以角度实现 canActivate auth 保护
【发布时间】:2018-11-15 23:07:50
【问题描述】:

我有一个带有这个函数的服务,它返回真或假,而不是令牌是否有效

loggedIn() {
return this.http.get('http://localhost:3000/users/validateToken')
  .map(res => res.json()).map(data => data.success);
}

我有一个身份验证守卫,可以在使用它的受保护路由上激活。

  canActivate(){
    this.authService.loggedIn().subscribe(res => {
      if(res) {
        return true;
      }
      else {
        this.router.navigate(['/login'])
        return false;
      }
    })
  }

但是我得到了这个错误。

错误地实现了接口“CanActivate”。财产类型 'canActivate' 不兼容。 类型 '() => void' 不可分配给类型 '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean | 承诺 |观察者...'。 类型 'void' 不能分配给类型 'boolean |承诺 |可观察的'。

我怎样才能实现我在这里尝试做的事情?

【问题讨论】:

    标签: javascript angular canactivate


    【解决方案1】:

    canActivate 函数必须返回布尔值、布尔值的承诺或布尔值的可观察值。

    在您的情况下,您什么也没有返回。可能是因为您在函数中省略了return

    但是如果你添加它就行不通了,因为那样的话,你会返回一个订阅,它不被签名接受。

    你可以这样做:

    canActivate() {
      return this.authService.loggedIn().map(res => {
        if(!res) {
          this.router.navigate(['/login']);
        }
        return res;
      });
    }
    

    使用此代码,您遵守签名,并保留您的路由逻辑。

    【讨论】:

    • .map函数已经在服务层使用了,还有什么需要再次使用,所以你不认为在canActivate中你需要使用subscribe吗?
    • 也只是想知道,如果我们将.subscribe 替换为.map,那么您的答案与我的相似,不是吗?
    • 再次使用map 允许在守卫内部实现自定义逻辑。第一个map 用于身份验证服务,这意味着它不能与守卫交互。 map 返回一个 Observable,同时 subscribe 返回一个订阅。所以不,答案不相似,因为我的遵循签名,而你的不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2021-12-29
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多