Наблюдаемые в readux эпопеи испускаются до инициализации пользователя firebase - PullRequest
0 голосов
/ 02 ноября 2018

В моем приложении я использую реаги, редукс и наблюдаемый редукс . Я добавил эпопею, которая прослушивает действие «LOCATION_CHANGE» реагирующего маршрутизатора и на основе этой полезной нагрузки запускает запрос ajax.

Для каждого запроса сервер ожидает заголовок, содержащий apiKey. Этот apiKey - это то, что я получаю от firebase auth getIdToken () method.

Итак, я завернул свои вызовы ajax так:

function getApiKey() {
  const currentUser = window.firebase.auth().currentUser
  return from(currentUser.getIdToken()).pipe(take(1))
}

export const getJson = url =>
  getApiKey().pipe(
    filter(apiKey => apiKey),
    mergeMap(apiKey =>
      ajax.get(url, {
        apiKey
      })
    )
  )

Причина, по которой мне нужно каждый раз получать токен из API Firebase вместо простого его сохранения в localstorage, заключается в том, что в случае истечения срока действия ключа этот метод обновит его и вернет новый действительный ключ.

Проблема в том, что currentUser равен нулю в течение тех нескольких миллисекунд, которые запускает приложение, но эпопеи пытаются извлечь данные на основе местоположения маршрута до инициализации модуля аутентификации firebase, поэтому я в итоге получаю:

«Не удается найти currentUser of undefined» или подобное сообщение.

Документы Firebase предлагают использовать " onAuthStateChanged ", для которого вызывается его обратный вызов, как только пользователь становится доступным, однако я не знаю, как встроить его в текущий поток.

Помощь здесь очень ценится! Спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

Попробуйте следующее, в пользовательском потоке всегда будет доступен последний сохраненный авторизованный пользователь

const user=new Observable(obs=>{
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    obs.next(user)
  } else {
    // No user is signed in.
    // depends what you want to do
    obs.error('unauthorized')
  }
})
}).pipe(shareReplay())

function getApiKey() {
  return user.pipe(switchMap(currentUser=>currentUser.getIdToken(),take(1))
}
...