【问题标题】:Angular CanActivate with Observable token not waiting带有可观察令牌的 Angular CanActivate 不等待
【发布时间】:2020-10-28 22:48:28
【问题描述】:

我知道有几个线程,我确实尝试了每个解决方案,但我不确定我的情况有什么不同。

我想创建一个 Guard 以在服务器验证令牌后访问视图以更改密码。

   canActivate(
     route: ActivatedRouteSnapshot,
     router: RouterStateSnapshot
   ):
     | Observable<boolean | UrlTree>
     | Promise<boolean | UrlTree>
     | boolean
     | UrlTree {
     const queryString = window.location.search;
     const urlParams = new URLSearchParams(queryString);
     if (urlParams.has("token")) {
       let token = urlParams.get("token");
       this.authService.getResetPasswordPermission(token).subscribe(
         (res) => {
           return true;
         },
         (err) => {
           return false;
         }
       );
     } else {
       return this.router.createUrlTree(["/authenticate"]);
     }
   }

我知道 subscribe 不会等待结果,所以只会执行 return this.router.createUrlTree(["/authenticate"]);。我尝试使用mappipe,但它永远不会进入方法的结果,所以reserr 都不是。

不知何故,我总是会被重定向到 localhost:4200 而不是 localhost:4200/changePassword 我想去的地方,甚至是 localhost:4200/authenticate 我应该登陆的地方。

与服务器对话的 Observable 方法如下所示:

   getResetPasswordPermission(token): Observable<any> {
     let data = { token: token };
     return this.http.get<any>(RESET_PASSWORD_PERMISSION_API, { params: data });
   }

如果成功,答案是ResponseEntity.ok(token)

如果不是ResponseEntity.badRequest()。我知道它们的语法都不正确,但你明白我的意思。

如果我要登陆 changePassword 页面,则需要再次使用令牌将其与更改请求一起发送。

【问题讨论】:

    标签: angular


    【解决方案1】:

    我知道您已经尝试过,但我认为地图运算符适合您的情况。 试试这样的:

    canActivate(
         route: ActivatedRouteSnapshot,
         router: RouterStateSnapshot
       ):
         | Observable<boolean | UrlTree>
         | Promise<boolean | UrlTree>
         | boolean
         | UrlTree {
         const queryString = window.location.search;
         const urlParams = new URLSearchParams(queryString);
         if (urlParams.has("token")) {
           let token = urlParams.get("token");
           return this.authService.getResetPasswordPermission(token).pipe(
              catchError(err => return of(null)),
              map(resp => !!resp)
           );
         } else {
           return this.router.createUrlTree(["/authenticate"]);
         }
       }
    

    【讨论】:

    • 等一下,我再试一次,但我认为这也无济于事
    • 好的,确实有效。至少在令牌有效的情况下。要理解它,这里的区别在哪里:stackoverflow.com/a/50143721/10565504?您在返回 (null) 之间缺少大括号。如果现在发现错误,我必须在我的问题中描述我只是登陆 localhost:4200 而不是 /authenticate 并尝试更改它但它不起作用
    • 没有区别,您的代码的问题是您订阅了 canActivate 函数中的 getResetPasswordPermission 函数,并且您试图在结果函数中返回一个简单的布尔值。 map 运算符返回一个带有映射值的可观察对象。要实现令牌无效的行为,您可以使用 ``` catchError((err) => { this.router.navigate(['/login']); return of(false); }) ```回答你链接
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2017-10-12
    • 2018-01-03
    • 2012-05-04
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多