0

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

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 | 承诺 | 可观察”。

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

4

1 回答 1

2

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

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

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

你可以做的是:

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

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

于 2018-06-06T10:08:46.047 回答