Google Firebase Angular Firestore switchMap - Ошибка Firebase DocumentReference.set () - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь настроить приложение Angular Firebase, где пользовательские данные, которыми я хочу поделиться с приложением, хранятся в базе данных Firestore. Я получаю следующую ошибку:

ОШИБКА Ошибка: Uncaught (в обещании): FirebaseError: [код = неверный аргумент]: функция DocumentReference.set () вызвана с недопустимыми данными. Неподдерживаемое значение поля: не определено (найдено в роли поля)

Мои данные настроены следующим образом:

enter image description here

Мой пользователь служба настроена следующим образом: auth.service.ts

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 './user.model';

import * as firebase from 'firebase';
import { AngularFireAuth } from '@angular/fire/auth';
import { faGameConsoleHandheld } from '@fortawesome/pro-light-svg-icons';

@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){
              console.log("user from constructor", user)
              return this.afs.doc<User>(`users/${user.uid}`).valueChanges();
            } else {
                console.log("returning null")
                return of(null)
            }
          })
        )
              } //end constructor

  private 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 = {
      uid: user.uid,
      email: user.email,
      displayName: user.displayName,
      role: user.role,
      thursdayCampaign: user.thursdayCampaign,
      menagerieCoast: user.menagerieCoast
    }
    console.log("role:", user.thursdayCampaign)
    return userRef.set(data, { merge: true})
  }

  async emailSignin(value){
    const provider = new firebase.auth.EmailAuthProvider();
    const credential = await this.afAuth.signInWithEmailAndPassword(value.email, value.password)
    return this.updateUserData(credential.user)
  }

user.model.ts:

export interface User {
  uid: string;
  email: string;
  displayName?: string;
  role: string;
  thursdayCampaign: Boolean;
  menagerieCoast: Boolean;

}

Я сузил проблему, которая создает ошибку, приложение возвращает null из this.user $ в конструкторе, но я не уверен, почему он это делает. Я думал, что установка AngularFirestoreDocument заставит его получить доступ к этому свойству, но это не так. Вы можете видеть, что некоторые функции журнала консоли разбросаны по всему коду. «Возвращаемый ноль» возвращается, когда я запускаю свою функцию,

1 Ответ

0 голосов
/ 04 мая 2020

Сообщение об ошибке (выделено мое):

Функция DocumentReference.set () вызвана с неверными данными. Неподдерживаемое значение поля: undefined (найдено в роли поля)

сообщает, что вы передали неопределенное значение для поля role. Это означает, что у вас есть неопределенное значение в user.role. Мы не можем понять, почему это здесь, поэтому вам придется отладить его, выяснив, откуда этот объект user.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...