0

我正在尝试做下一个......我有一个 API,我通过 POST 发送一个 JWT 令牌以验证它是否有效/过期,

所以在我的角度登录服务中,我有一个这样的方法。

isUserlogged() {
  return this.httpClient.get(`${this.URL}/verifyToken`, { headers: { 'authorization': localStorage.getItem('token') } })   
}

这个订阅返回一个布尔值,这里一切正常。

现在我正在我的应用程序中实现 Guards,所以现在我想为我的 canActivate 方法使用该布尔值来阻止访问...我读到我需要在此方法中返回 true 或 false 以允许或阻止访问我之前配置的路线

所以我在canActivate里面做这样的事情。

this.loginService.isUserlogged().subscribe((response: boolean)=>{  

if(response){
   return true;
}
   return false;
});

但这是返回无效......为什么?如何从此订阅中检索真值或假值?

4

2 回答 2

2

不要从守卫路线内部返回订阅,如果不是布尔值,则返回布尔值的 Observable。

return this.loginService.isUserlogged()

由于“isUserlogged”已经在这里给你一个布尔输出,你可以直接返回 Observable。

如果isUserlogged()没有返回布尔值,则通过管道传输它。

return this.loginService.isUserlogged().pipe(
    map((resp) => {
        // some logic here, check the return.
        // based on the logic
        if (something) {
            return true
        }
        return false
    })
)

如果您的API通话结束并返回正确的响应,这一切都会奏效。如果您的 API 返回 void,那么您没有提供有关 API 调用和 API 工作的任何详细信息。(首先使用 HTTP 客户端测试您的 API,例如:Postman,如果响应正确,则将其与 Angular 集成)

于 2018-12-10T04:20:54.350 回答
0

我的解决方案,Promise Method 和一个健康的跑卫。


canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.mailVerifyControl()
      .then(() => {
        return true;
      })
      .catch((err) => {
        return false;
      });
  }


  mailVerifyControl(): Promise<boolean> {
    return new Promise((resolve, reject) => {
      if (this.authService.isMailVerified === true) {
        reject()
      }
      resolve();
    });
  }

于 2020-06-11T08:16:41.367 回答