Пользовательский объект Firebase и настраиваемый объект Firestore - PullRequest
0 голосов
/ 05 мая 2020

Я недавно задал этот вопрос, в котором было много информации, но я не думаю, что задавал правильный вопрос. 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 (найдено в роли поля)

1 Ответ

1 голос
/ 06 мая 2020

Если функция updateUserData вызывается только при фактической аутентификации, вы можете просто удалить role, thursdayCampaign, menagerieCoast из полезных данных.

Это потому, что { merge: true} гарантирует, что изменяются только данные, существующие в полезной нагрузке, а не весь документ, поэтому ваши другие уже существующие поля в документе останутся нетронутыми, и вы больше не получите эту ошибку.

Метод updateUserData на самом деле необходим для входа нового пользователя, поскольку он отражает данные из firebase auth в вашу базу данных firestore, то есть там, где ваш уникальный uid создается в базе данных. Если вам понадобится обновить пользователей позже при выполнении вашего приложения, я бы посоветовал вам создать для этого отдельный метод.

ПРИМЕЧАНИЕ : Это фактически описано в видеоуроке, которым вы поделились в комментариях к вашему вопросу. Для обращения к сообществу по аналогичной проблеме вот ссылка .

...