Estoy tratando de cerrar la sesión del usuario actualmente conectado en mi aplicación angular. Ese es mi servicio al cliente:
export class AuthClientService { public register(email: string, password: string): Observable<Object> { return from( createUserWithEmailAndPassword(this.firebaseService.auth, email, password) ); } public logIn(email: string, password: string): Observable<Object> { return from( signInWithEmailAndPassword(this.firebaseService.auth, email, password) ); } public logOut(): Observable<void> { return from(signOut(this.firebaseService.auth)); } constructor(private firebaseService: FirebaseService) {} }y servicio de base de fuego:
@Injectable({ providedIn: 'root', }) export class FirebaseService { public app = initializeApp(firebaseConfig); public auth = getAuth(); }pero cuando llamo a la función de cierre de sesión hay este error:
ERROR Error: No capturado (en promesa): TypeError: No se puede asignar a la propiedad de solo lectura 'currentUser' del objeto '[object Object]' TypeError: No se puede asignar a la propiedad de solo lectura 'currentUser' del objeto '[object Object]' en el índice- 8593558d.js:2473 en Generator.next () en asyncGeneratorStep (asyncToGenerator.js:3) en _next (asyncToGenerator.js:25) en asyncToGenerator.js:32 en la nueva ZoneAwarePromise (zone.js:1387) en asyncToGenerator.js: 21 en AuthImpl.directlySetCurrentUser (index-8593558d.js:2466) en index-8593558d.js:2329 en Generator.next () en resolvePromise (zone.js:1213) en zone.js:1120 en zone.js:1136 en ZoneDelegate.invoke (zone.js:372) en Object.onInvoke (core.js:28692) en ZoneDelegate.invoke (zone.js:371) en Zone.run (zone.js:134) en zone.js:1276 en ZoneDelegate.invokeTask (zone.js:406) en Object.onInvokeTask (core.js:28679)
La aplicación lo está llamando desde los efectos de ngrx, pero no creo que sea un problema, porque traté de llamarlo sin ngrx y todavía hay este error.
Entonces, después de investigar un poco, encontré una solución, no estoy seguro de la causa de este problema, pero esto puede ser útil para alguien. Primero moví la lógica de autenticación del usuario de los efectos ngrx al observador de autenticación de fuego angular de esta manera:
public authObserver(): void { this.angularFireAuth.user.subscribe((user) => { if (user) { this.store.dispatch(readCredentials({ userCredential: user })); this.router.navigate(['/dashboard']); } }); }Después de eso, me di cuenta de que la causa del error era pasar el objeto del usuario a la función de acción ngrx. Cuando creo una copia profunda del usuario del objeto y la paso para que funcione así, funciona bien.
public authObserver(): void { this.angularFireAuth.user.subscribe((user) => { if (user) { let copy = JSON.parse(JSON.stringify(user)); this.store.dispatch(readCredentials({ userCredential: copy })); this.router.navigate(['/dashboard']); } }); }