我有一个带有此函数的服务,该函数在令牌无效时返回true或false

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)=>布尔值|
  承诺|观察者...'。
        不能将类型“ void”分配给类型“ boolean |承诺|可观察的”。


我如何才能在这里实现我要执行的操作?

最佳答案

canActivate函数必须返回一个布尔值,一个布尔值的promise或一个可观察的布尔值。

就您而言,您什么也不返回。可能是因为您省略了函数中的return

但是,如果添加它将不起作用,因为那样的话,您将返回订阅,签名不接受该订阅。

您可以执行以下操作:

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


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

关于javascript - 在angular中实现canActivate auth Guard,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50717424/

10-13 03:09