Получение неверного значения в Angular HTTP-методе с использованием RXJS - PullRequest
0 голосов
/ 27 сентября 2018

Я столкнулся с серьезной проблемой в моем проекте.Алгоритм был написан.Но я не смог правильно реализовать, написав код на Angular и RxJS.Мой алгоритм:

  1. Получить идентификатор пользователя (для этого я использовал getUserbyToken (), который сохранил весь userUUID в массив с именем userUUID = [])
  2. Send to Group APIи убедитесь, что userUUID принадлежит какому количеству групп (для этого я использовал одну и ту же функцию getUserbyToken () с switchMap rxjs и получением groupUUID)
  3. Сохранение идентификатора группы в массив с именем groupUUID = [];
  4. Затем передайте идентификаторы группы в Role API для проверки роли пользователей.Если несколько групп, то нужно зациклить, чтобы я использовал getRoleOftheUser () с помощью rxJs concatMap ().И получение одного многомерного объекта, и внутри этого объекта есть некоторый объект массива.Это выглядит как на картинке ниже Возвращенный объект после вызова RollAPI Объект идентификатора

  5. И после этого я проверил пользователя Roll, используя условие some if else.Вы можете видеть картинку, что ключи объекта совпадают с моим userUUID.Поэтому, если userUUID соответствует ключам объекта, тогда я проверил значение этих ключей. Если значение равно 'ROLE_ADMIN' в соответствии с UUID ключа, соответствующего пользователю, тогда я хочу вернуть только соответствующий groupUUID, который полностью удовлетворяет условию.К сожалению, это условие if else внутри RxJS оператора не работает должным образом, и я получаю каждый groupUUID, который я передаю через $ {item}.

Результат вывода, которыйпоказывает всем groupUUID, что я являюсь паролем Код:

userUUID = [];
  groupUUID = [];
  constructor(private http: HttpClient) {}
  getUserbyToken() {
    const option = {
      params: new HttpParams().set('token', this.token)
    };
    return this.http
      .get<any>(`${this.baseURL}/auth/jwt/tokeninfo`, option)
      .pipe(
        switchMap(res => {
          if (!this.userUUID.includes(res.uuid)) {
            this.userUUID.push(res.uuid);
          }
          return this.http
            .get<any>(`${this.baseURL}/aaa/users/${res.uuid}/groups`)
            .pipe(map(groups => groups));
        })
      )
      .subscribe(result => {
        for (let i = 0; i < result.length; i++) {
          if (!this.groupUUID.includes(result[i].uuid)) {
            this.groupUUID.push(result[i].uuid);
          }
        }
        console.log(this.groupUUID);
        console.log( this.userUUID.toString());
      });
  }

  getRoleOftheUser() {
    if (this.groupUUID.length > 0) {
      of(...this.groupUUID)
        .pipe(
          mergeMap(item =>
            this.http
              .get<any>(
                `${this.baseURL}/aaa/groups/${item}/effectiveRolesByUser?item=${item}`
              )
              .pipe(
                concatMap(id => {
                  for (const key in id) {
                    if (!id.hasOwnProperty(key)) {
                        continue;
                    }
                   if (!this.matchUUID(key) ) {
                     continue;
                   } else {
                      if (id[key] === 'ROLE_ADMIN') {
                         return item;
                      } else {
                        return item;
                      }
                  }
              }
                })
              )
          ),
          delay(1000)
        )
        .subscribe(result => {
          console.log(result);
        });
    }
  }

  private matchUUID(value) {
    const stringifyUserUUID = this.userUUID.toString();
    if (value === stringifyUserUUID ) {
      return value;
    }
  }

Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?Спасибо

...