查询不同的端点

时间:2017-04-15 17:23:14

标签: angular rxjs user-roles

我努力在TypeScript&中实现一个功能。 RxJs从后端返回Observable数据。我需要根据用户角色查询不同的端点。我使用angular-JWT进行身份验证。我有两个问题:

  1. 目前代码编译得很好,但第二对请求一直被取消。为什么呢?

  2. 有没有比zip + throw + catch更好的方法呢?我一直在搜索rxjs文档,但一无所获。

  3. 代码:

    public getData(): Observable<Data> {
      return Observable.zip(
        this.userService.getCurrentUser(),
        this.authHttp.get(this.adminUrl),
        (user, adminResponse) => {
          if (user.role == 'admin') {
            return adminResponse.json() as BackendResponse
          } else {
            throw "You are not an admin";
          }
        })
        .catch(error => {
          return Observable.zip(
            this.userService.getCurrentUser(),
            this.authHttp.get(this.normalUrl),
            (user, normalResponse) => {
              if (user.role == 'normal') {
                return normalResponse.json() as BackendResponse
              } else {
                throw "You are not allowed to get this resource";
              }
            })
        })
        .catch(error => {
          return Observable.throw(error)
        });
    }
    

    管理端点为管理员和普通用户返回一些数据(在我的项目中是必需的),但如果标准用户查询其特殊API,则可以获得更多数据。

2 个答案:

答案 0 :(得分:0)

这样的事情会起作用。我们有一个第一个可观察的用户$返回有关用户的数据,标志是用户是管理员。第二个observable auth $使用此信息创建一个具有正确路径和zip的请求,该请求从两个observable中获取数据并将它们组合起来。

const user$ = Observable.of({name:'julia', isAdmin})
    .publishLast()
    .refCount();

const auth$ = user$
.switchMap(user => 
    Observable.of(`${this.baseurl}${user.isAdmin ? 'adminPath' 
                                                 :'normalpath'}`));

Observable.zip(user$, auth$, 
     (x,y) =>  `user is ${JSON.stringify(x)} and auth is ${y}`)
     .subscribe(result =>  this.result = result);
}

答案 1 :(得分:0)

检查用户是否处于正确的角色,如果不是,则抛出客户端异常是绝对错误的。如果您的服务器允许访问成功,那么您就会遇到严重的安全漏洞。如果您的服务器正确阻止了访问,那么您的所有检查都会让您感到困惑和毫无意义。

此外,捕获和重新抛出这样的异常是完全没有意义的,并导致冗余和错综复杂的代码。只是让错误浮出水面。

鉴于此,您应该需要的只是

export default class {
  constructor(readonly authHttp: AuthHttp) { }

  get urls() {
    return {
      admin: this.adminUrl,
      normal: this.normalUrl
    };
  }

  getData(): Observable<BackendResponse> {
    return this.userService.getCurrentUser()
      .flatMap(user => this.authHttp.get(this.urls[user.role]))
      .map(response => response.json() as BackendResponse);
  }
}