Project использует авторизацию firebase, имея класс auth.service.ts
, который разрешает все, что связано с пользователем. Он имеет общедоступное c наблюдаемое пользовательское свойство, которое затем используется в проекте для различных целей.
Этот код работал до последнего обновления пакета.
constructor(
private firestore: AngularFirestore,
private fireauth: AngularFireAuth
) {
this.user = this.fireauth.authState.pipe(switchMap(user => {
if (user) {
return this.firestore.doc<User>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
}
}));
}
После обновления до последних версий инструментов Firebase и angular все подписки на authservice.user
больше не срабатывают вообще. Я обнаружил, что если я использую .pipe(first())
до .pipe(switchMap(
, я на самом деле получаю триггер пользователя и подписки, но он не работает как положено. Поскольку, когда пользователь вышел из системы, он не очищает свойство user
от authservice.
this.user = this.fireauth.authState.pipe(first()).pipe(switchMap(user => {
if (user) {
return this.firestore.doc<User>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
}
}));
Причина, по которой я попытался это сделать, заключается в том, что valueChanges()
возвращает наблюдаемое, которое затем оборачивается в наблюдаемое. Поэтому я подумал, что это главная проблема, а может и не быть.
Я пробовал несколько обходных путей и экспериментировал с использованием authState
непосредственно на компонентах вместо моего собственного сервиса, но есть немало причуд, которые случается, что, используя мой ограниченный опыт работы с angular, я не могу объяснить подробно. В результате подписки даже не происходят, и ошибок нет.
Подробнее Я не буду sh использовать firebase.User
в качестве основного объекта пользователя, скорее из-за возможности редактировать и настраивать профиль, добавьте роли и т. д. c. Я думал, что лучше просто использовать пользовательский. Вот почему я беру User
из пожарного магазина.
Кроме того, я изучил документацию библиотеки .
ОБНОВЛЕНИЕ Чтобы доказать это, я удалил канал first()
и изменил один из компонентов, которые зависят от него, для обработки вложенных наблюдаемых. Вот так.
this.authService.user.subscribe(currentUser => {
currentUser.subscribe(u => {
this.characterService.readCharacters(u.uid).subscribe({
next: (value) => { this.characters = value; }
});
})
});
Это на самом деле работает. Просто так не должно быть.