http - Angular2 需要异步获取的结果以允许访问路由

标签 http angular angular-routing

我使用 AuthGuard 来保护我的路由,确保用户在看到应用程序的仪表板之前正确登录。

授权 guard :

canActivate(
    next:  ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ) {
    // return true;
    return this.userService.getValidLoginCheck();
}

但是 getValidLoginCheck() 不返回 bool 值:

getValidLoginCheck(): boolean {
    let headers = new Headers();

    let options = new RequestOptions({ headers: headers });

    headers.append('authorization', this.getToken());

    this.http.get(this.baseUrl + 'api/auth/checkToken', options)
      .map(res => res.json())
      .subscribe(data => {return data.message === 'valid token' });

  }

我知道为什么会这样,但是我怎样才能让 getValid... 函数等待 http.get 完成,这样我才能正确地保护我的路由?

最佳答案

CanActivate 方法接受 3 种类型的响应(Observable、Promise 和 boolean),这里是方法的签名:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;

因此,您可以利用 Observable 响应并将您的服务的 Observable 变成这样的 Observable:

canActivate(
    next:  ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ) {

       return new Observable<boolean>((observer: Observer<boolean>) => {
         this.userService.getValidLoginCheck()
         .subscribe(data => {observer.next(data.message === 'valid token')},
          error => { console.log("error while calling getValidLoginCheck" ); observer.next(false)});
         observer.complete();
       });
}

您应该从您的服务中返回一个可观察对象:

getValidLoginCheck(): Observable<Response> {
    let headers = new Headers();

    let options = new RequestOptions({ headers: headers });

    headers.append('authorization', this.getToken());

    return this.http.get(this.baseUrl + 'api/auth/checkToken', options)
      .map(res => res.json());
  }

这就是我所做的,它对我有用,我更喜欢在订阅内调用一个方法并发送观察者和 http 响应,然后在隔离方法内评估响应,但这是我个人的偏好,我希望如此有帮助。

关于http - Angular2 需要异步获取的结果以允许访问路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38373878/

相关文章:

http - iTunes 范围请求;播客被拒绝

mysql - 使用 POST 将安全数据从 .NET 发送到 Linux 服务器?

Angular 在继续之前等待 promise 解决

angular - 如何从实现 ControlValueAccessor 的组件中获取对 FormControl 的引用?

javascript - 如何防止 Angular 应用程序中路由器链接的默认点击行为?

angular - 类型错误 : Invalid Event Target - But just by using direct Route

c# - C# 判断网页是否有RSS的方法

html - 通过 HTTP 处理文件上传的最佳方式

javascript - HTML 和 Angular : Select depends on other select

javascript - 从 Controller 更改 View 不会触发 View 更新