canActivate routeguard с вложенными наблюдаемыми с помощью оператора switchmap работает только из браузера

Я использую firebase с аутентификацией и firestore. Прошедшие аутентификацию пользователи сохраняются в базе данных при регистрации с полем дополнительных ролей, где у некоторых пользователей есть роль администратора. Я хочу защитить административный маршрут и использую canActivate route guard. В функции canActivate я использую 2 наблюдаемых. Первый 1 получает зарегистрированного пользователя и вложен в этот другой наблюдаемый объект, который получает сохраненных пользователей из firestore, использует информацию оттуда o cehck, если зарегистрированный пользователь является администратором или нет. Проблема в том, что routeguard работает нормально, когда браузер обновляется после типов маршрута в браузере, но когда маршрут вызывается со ссылкой на маршрутизатор на кнопке, ничего не происходит.

пытался использовать синхронные значения, но они работают только один раз и перестают работать после навигации.

Функция canActivate: https://i.imgur.com/Rf0BZ79.png

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

    return this.afAuth.getStateOnly().pipe(switchMap(user => { return this.db.getRole(user.uid) }))

  }

Используемые наблюдаемые: https://i.imgur.com/hRp8zyf.png https://i.imgur.com/oV56AGl.png

// пользовательский объект или null из firebase

 getStateOnly() {
    return this.afAuth.authState 
  }

// проверка роли и возврат true или false (userArr - это массив пользователей, наблюдаемых для хранения пользователей из firestore)

getRole(uid: string): Observable<boolean> {
    return this.userArr.pipe(map(users => {
      return users.filter(user => {
        if (user.uid === uid) {
          return user
        }
      })[0].roles.includes('admin')
    }))

Таким образом, это работает только тогда, когда я ввожу путь в браузере, и браузер обновляется при загрузке маршрута. Он не работает, когда я нажимаю кнопку администратора, чтобы перейти на страницу администратора (не с routerLink или router.navigate (..))


person Nándor Szűcs    schedule 11.09.2019    source источник
comment
Попробуйте добавить first() в конвейер Observable, чтобы убедиться, что Observable завершается.   -  person Will Alexander    schedule 11.09.2019
comment
если это то, что вы имели в виду: return this.afAuth.getStateOnly (). pipe (switchMap (user = ›{return this.db.getRole (user.uid)}), first ()) все еще не хорошо   -  person Nándor Szűcs    schedule 11.09.2019


Ответы (1)


образ нового canActivate () Мне удалось решить проблему, но я все еще не могу конечно, почему предыдущая реализация не сработала .. firebase иногда бывает странной. Итак, я создал новый наблюдаемый объект, который получает пользователей из хранилища огня, и преобразовывал этот вывод непосредственно в функцию активации банки, см. Изображение. Раньше я получил пользователей, преобразовал его и вызвал преобразованное наблюдаемое из функции canactivate, которая, похоже, не работала. Значит, с потоком данных что-то не так.

person Nándor Szűcs    schedule 11.09.2019