Я недавно задал этот вопрос, в котором было много информации, но я не думаю, что задавал правильный вопрос. Google Firebase Angular Firestore switchMap - Firebase Error DocumentReference.set () .
Насколько я понимаю, AngularFireAuth заключается в том, что вы используете его для создания объекта User с набором значений, большинство из которых которые неизменны. Если я хочу добавить собственное значение, мне нужно сделать это через Google Firestore.
Я создал следующую запись firestore с этой информацией: .
I ' Мы также создали модель пользователя:
export interface User {
uid: string;
email: string;
displayName?: string;
role: string;
thursdayCampaign: Boolean;
menagerieCoast: Boolean;
}
Насколько я понимаю, следующий код должен go для встроенного объекта пользователя AngularFireAuth, чтобы получить uid, а затем я должен использовать switchMap для перенаправления на свой магазин firebase. Проблема, с которой я сталкиваюсь, заключается в том, что когда я вхожу в систему, this.updateUserData получает правильные учетные данные, а затем пытается обновить объект пользователя AngularFireAuth с помощью константы данных, которую я там создаю. Это приводит к тому, что функция выдает ошибку, поскольку userRef.set (data, {merge: true}) пытается объединить роль, thursdayCampaign и menagerieCoast в объект пользователя AngularFireAuth, когда эти значения не существуют для этого объекта.
У меня вопрос, почему моя ссылка не перенаправляется. Нужно ли мне где-то вызывать this.user $?
Рассматриваемый код приведен ниже. Надеюсь, я задаю этот вопрос лучше, чем мой предыдущий вопрос.
import { Injectable } from "@angular/core";
import { Router } from '@angular/router';
import { auth } from 'firebase/app';
import {
AngularFirestore,
AngularFirestoreDocument
} from '@angular/fire/firestore'
import { Observable, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { User } from './user1.model';
import * as firebase from 'firebase';
import { AngularFireAuth } from '@angular/fire/auth';
@Injectable({
providedIn: 'root'
})
export class AuthService {
user$: Observable<User[]>;
constructor(private afAuth: AngularFireAuth,
private afs: AngularFirestore,
private router: Router) {
//This is how we're getting into the firestoreDB
this.user$ = this.afAuth.authState.pipe(
switchMap(user => {
if (user){
return this.afs.doc<User>(`/users/${user.uid}`).valueChanges();
} else {
return of(null)
}
})
)
} //end constructor
public updateUserData(user){
//sets user data to firestore on login
const userRef: AngularFirestoreDocument<User> = this.afs.doc(`users/${user.uid}`)
console.log("userRef", userRef)
const data: User = {
uid: user.uid,
email: user.email,
displayName: user.displayName,
role: user.role,
thursdayCampaign: user.thursdayCampaign,
menagerieCoast: user.menagerieCoast
}
console.log("data", data)
userRef.set(data, { merge: true})
}
async emailSignin(value){
//const provider = new auth.EmailAuthProvider();
const credential = await this.afAuth.signInWithEmailAndPassword(value.email, value.password)
return this.updateUserData(credential.user),
this.router.navigate(['/home'])
}
async googleSignin(){
const provider = new auth.GoogleAuthProvider();
const credential = await this.afAuth.signInWithPopup(provider);
return this.updateUserData(credential.user)
}
Ошибка при вызове emailSignin:
ERROR Ошибка: Uncaught (в обещании): FirebaseError: [code = invalid-argument]: функция DocumentReference.set () вызывается с недопустимыми данными. Неподдерживаемое значение поля: undefined (найдено в роли поля) FirebaseError: функция DocumentReference.set () вызвана с недопустимыми данными. Неподдерживаемое значение поля: undefined (найдено в роли поля)